1. 程式人生 > >Spring Boot入門(一)返回JSON資料及資料封裝

Spring Boot入門(一)返回JSON資料及資料封裝

1.從建立的專案的環境裡可以看到Spring Boot預設載入了Jackson,所以Spring Boot專案預設使用Jackson來返回JSON資料。

Jackson對空屬性統一設定為null,不管該屬性是什麼資料型別,這不利於資料操作,可以對Jackson進行配置

(1.1)在src/main裡建立包config,在包裡建立類JacksonConfig,該配置可以把所有空屬性統一設定為“”

package com.itcodai.course.config;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import java.io.IOException;
// 使用阿里巴巴的fastJson時,把jackson的配置註釋掉

@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

2.使用阿里的fastJson來返回JSON資料

(2.1)pom.xml裡引入相關jar包

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.35</version>
</dependency>

(2.2)在config包裡建立類fastJsonConfig,對各種資料型別設定其為空值時的預設值

package com.itcodai.course.config;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class fastJsonConfig extends WebMvcConfigurationSupport {

    /**
     * 使用阿里 FastJson 作為JSON MessageConverter
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(
                // 保留map空的欄位
                SerializerFeature.WriteMapNullValue,
                // 將String型別的null轉成""
                SerializerFeature.WriteNullStringAsEmpty,
                // 將Number型別的null轉成0
                SerializerFeature.WriteNullNumberAsZero,
                // 將List型別的null轉成[]
                SerializerFeature.WriteNullListAsEmpty,
                // 將Boolean型別的null轉成false
                SerializerFeature.WriteNullBooleanAsFalse,
                // 避免迴圈引用
                SerializerFeature.DisableCircularReferenceDetect);

        converter.setFastJsonConfig(config);
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        List<MediaType> mediaTypeList = new ArrayList<>();
        // 解決中文亂碼問題,相當於在Controller上的@RequestMapping中加了個屬性produces = "application/json"
        mediaTypeList.add(MediaType.APPLICATION_JSON);
        converter.setSupportedMediaTypes(mediaTypeList);
        converters.add(converter);
    }
}

3.對資料的封裝,建立entity包,在包裡建立JsonResult類,用以資料封裝

package com.itcodai.course.entity;

public class JsonResult<T> {

    private T data;
    private String code;
    private String msg;

    /**
     * 若沒有資料返回,預設狀態碼為0,提示資訊為:操作成功!
     */
    public JsonResult() {
        this.code = "0";
        this.msg = "操作成功!";
    }

    /**
     * 若沒有資料返回,可以人為指定狀態碼和提示資訊
     * @param code
     * @param msg
     */
    public JsonResult(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * 有資料返回時,狀態碼為0,預設提示資訊為:操作成功!
     * @param data
     */
    public JsonResult(T data) {
        this.data = data;
        this.code = "0";
        this.msg = "操作成功!";
    }

    /**
     * 有資料返回,狀態碼為0,人為指定提示資訊
     * @param data
     * @param msg
     */
    public JsonResult(T data, String msg) {
        this.data = data;
        this.code = "0";
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}