springboot返回json的格式化問題
在實際開發過程中,介面的定義和規範,嚴格意義上會細化到,空字串應該返回null還是"",亦或是"null",空陣列應該返回null還是[],包括是不是要返回value為null的欄位。但是springboot預設使用的是Jackson json轉換器。Jackson在設定json的格式化問題時雖然可以通過手動重寫方法實現,但是不夠靈活。因而可以使用阿里的fastjson實現格式的靈活配置,下面介紹兩種的具體實現:
一、通過fastjson實現
在Application類下面新增如下程式碼,將預設的json轉換工具替換為fastjson。其中SerializerFeature裡面有很多可自行設定的返回樣式,可以自行度狗瞭解。
/** * 替換框架json為 FastJson返回 * * @param */ @Bean public HttpMessageConverters configureMessageConverters() { // 1.構建了一個HttpMessageConverter FastJson訊息轉換器 FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); // 2.定義一個配置,設定編碼方式,和格式化的形式 FastJsonConfig fastJsonConfig = new FastJsonConfig(); // 3.設定PrettyFormat格式化,設定空字元,空集合返回空陣列[]等 fastJsonConfig.setSerializerFeatures( // 是否格式化返回Json SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty); // 4.處理中文亂碼問題 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); fastConverter.setSupportedMediaTypes(fastMediaTypes); // 5.將fastJsonConfig加到訊息轉換器中 fastConverter.setFastJsonConfig(fastJsonConfig); return new HttpMessageConverters(fastConverter); }
二、通過使用Jackson的ObjectMapper,實現自己的SerializerModifier實現
在Application類下面新增如下程式碼:
/** * 預設返回空json字串,陣列序列化為[] * * @param builder * @return */ @Bean @Primary @ConditionalOnMissingBean(ObjectMapper.class) public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); // 為mapper註冊一個帶有SerializerModifier的Factory,此modifier主要做的事情為:當序列化型別為array,list、set時,當值為空時,序列化成[] objectMapper.setSerializerFactory(objectMapper.getSerializerFactory().withSerializerModifier(new SerializerModifier())); // 空值處理為空串 objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() { @Override public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeString(""); } }); return objectMapper; }
實現自己的SerializerModifier:
package com.walletServer.config;
import java.util.List;
import java.util.Set;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
public class SerializerModifier extends BeanSerializerModifier {
private JsonSerializer<Object> _nullArrayJsonSerializer = new ArrayJsonSerializer();
@Override
public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc,
List<BeanPropertyWriter> beanProperties) {
// 迴圈所有的beanPropertyWriter
for (int i = 0; i < beanProperties.size(); i++) {
BeanPropertyWriter writer = beanProperties.get(i);
// 判斷欄位的型別,如果是array,list,set則註冊nullSerializer
if (isArrayType(writer)) {
//給writer註冊一個自己的nullSerializer
writer.assignNullSerializer(this.defaultNullArrayJsonSerializer());
}
}
return beanProperties;
}
// 判斷是什麼型別
protected boolean isArrayType(BeanPropertyWriter writer) {
Class<?> clazz = writer.getPropertyType();
return clazz.isArray() || clazz.equals(List.class) || clazz.equals(Set.class);
}
protected JsonSerializer<Object> defaultNullArrayJsonSerializer() {
return _nullArrayJsonSerializer;
}
}
package com.walletServer.config;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
public class ArrayJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
if (value == null) {
jgen.writeStartArray();
jgen.writeEndArray();
} else {
jgen.writeObject(value);
}
}
}
相關推薦
springboot返回json的格式化問題
在實際開發過程中,介面的定義和規範,嚴格意義上會細化到,空字串應該返回null還是"",亦或是"null",空陣列應該返回null還是[],包括是不是要返回value為null的欄位。但是springboot預設使用的是Jackson json轉換器。Jackson在設定js
springboot 返回json字符串格式化問題
返回 -o 註解 message jackson 2.0.8 2.0 ssa serializa 在idea中yml文件中添加以下註解就可以格式化json字符串效果 spring: jackson: serialization: indent-outpu
SpringBoot 返回json 字符串(jackson 及 fast json)
json數據 serialize fastjson serial app style sage cti 字符串 一、jackson 1、Controller [email protected]/* */ [email protected]/* */
springboot返回json
line vat public 我們 div pre 字符 json解析 name 1.新建Demo類: public class Demo { private int id; private String name; public int ge
SpringBoot 返回Json實體類屬性大小寫問題
問題: 如果前端使用的引數是大寫的而不是標準的駝峰式寫法,那麼後臺在進行引數的互動的時候會出現引數接收不到的問題 如:前端使用 Title 而後端實體類中式title 這樣是不統一的; 解決:兩種方式 Jackjson 和 Fastjson
3、SpringBoot 返回JSON資料格式
SpringBoot 返回 JSON 資料格式 github原始碼 方式一:使用自帶的 jackson 將 Controller 層的 @Controller 註解替換成 @RestController 即可 方式二:完美使用 FastJson pom 引入依賴:
springboot 返回json格式資料時間格式配置
mybatis資料查詢返回的時間,是一串數字,如何轉化成時間。兩種方法,推薦第一種方法一:可以在apllication.property加入下面配置就可以#時間戳統一轉換spring.jackson.date-format=yyyy-MM-dd HH:mm:ssspring.
SpringBoot | 返回Json實體類屬性大小寫問題
his 駝峰 font property ride java jsonp lena () 今天遇到一個很有意思的問題,寫個微博記錄一下。前端朋友要我傳一個大寫屬性(類似於PEOPLEName)的json實體給他,可是就算把變量名寫成這樣,他收到的還是(peop
SpringBoot 02_返回json數據
back html npe 後端 定義 private clas code logs 在SpringBoot 01_HelloWorld的基礎上來返回json的數據,現在前後端分離的情況下多數都是通過Json來進行交互,下面就來利用SpringBoot返回Json格式的數據
SpringBoot Jack Json 返回前端時間少一天的問題
前倆天在專案中遇到一個問題,時間在資料庫是正常的 但是返回前端的時候卻少了一天;查詢了一下是JackJson 的問題 那麼如何解決這個問題呢? 我們只需要在。yml中對jackjson 進行配置就好 jackson: serialization: #格式化輸出
mvc 返回json格式時間格式化
protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior) {
SpringBoot自定義404、500返回JSON資料
現有的方法,編寫全域性的異常處理,需要在SpringBoot配置檔案中配置沒有找到Controller時丟擲異常,並且將靜態資源對映關閉。因為預設是不丟擲異常的,是去找錯誤頁面,所以還需要關閉靜態資源對
Spring Boot | 返回Json資料中的Date格式化
--昨夜西風凋碧樹,獨上高樓,望盡天涯路 採用Spring Boot加Mybatis時,Mybatis中時間格式為datetime型別,Java中實體類型別為Date型別: 當通過Spring Boot自
SpringBoot+Jpa 在MySql中自動生成時間和返回json格式資料時間格式配置
先說資料時間格式的設定 有兩種 一種是:可以在apllication.property加入下面配置就可以 #時間戳統一轉換 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=
SpringBoot返回date日期格式化,解決返回為TIMESTAMP時間戳格式或8小時時間差(轉載)
@JSONField(format = "yyyy-MM-dd HH:mm:ss") //FastJson包使用註解 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") //Jack
springboot整合springdataJPA 2.1.0 返回json資料異常
提示資訊如下 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddy
返回json資料,格式化日期型別去掉時分秒
private Date xxx; 返回json資料,預設帶著時分秒00:00:00,去掉時分秒使用註解@JsonFiled 1需要引fastjson包 <!-- https://mvnrepo
springboot處理統一返回json資料格式
第一步,寫一個實體類JsonResultEntity,定義返回的引數 package com.bujiang.magic.common.utils; public class JsonResultEntity { private Object data; private String
Java bean物件返回資料Json格式化
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "##0.00") //精度保留2位小數 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-
SpringBoot之返回json數據
class tro load span ava host nbsp get arr 一、創建一個springBoot個項目 二、編寫實體類 /** * 返回Json數據實體類 */ public class User { private int