Spring Boot入門(一)返回JSON資料及資料封裝
阿新 • • 發佈:2019-01-31
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; } }