@JsonSerialize和@JsonInclude注解
@JsonSerialize
后端開發時返回給前端的數據格式有時可能并不符合。
舉個例子,比如一張表中的時間,數據庫中存儲的是yyy-mm-dd hh:mm:ss 這樣的形式,而前段需要的是精確到秒的格式,這是就會出現問題。此時可以利用@JsonSerialize注解,改變返回給前端的json格式
@JsonSerialize注解,主要用于數據轉換,該注解作用在該屬性的getter()方法上。
使用步驟
1. 指定一個格式化的類
里面寫好規則
//JsonSerializer<Integer>:Integer為要轉換的類型 public class MySerializerUtils extends JsonSerializer<Integer> { @Override public void serialize(Integer status, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { String statusStr = ""; switch (status) { case 0: statusStr = "暫存"; break; case 1: statusStr = "待上報"; break; case 2: statusStr = "待審核"; break; case 3: statusStr = "已審"; break; case 4: statusStr = "退回"; break; case -1: statusStr = "已刪"; break; default: statusStr = "狀態信息不符合"; } jsonGenerator.writeString(statusStr); } }
或
//JsonSerializer<Date>:Date為要轉換的類型 public class Date2LongSerializer extends JsonSerializer<Date> { @Override public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeNumber(date.getTime() / 1000); } }
2. 在實體類中在要轉換的字段上加上該注解
@JsonSerialize(using = MySerializerUtils.class) private int status;
或
//創建時間 @JsonSerialize(using = Date2LongSerializer.class) private Date creatTime; //更新時間 @JsonSerialize(using = Date2LongSerializer.class) private Date updateTime;
@JsonInclude
返回前端的實體類中如果某個字段為空的話那么就不返回這個字段了
所以將@JsonInclude(Include.NON_NULL) 這個注解放在類頭上就可以解決。 實體類與json互轉的時候屬性值為 null 的不參與序列化
JsonJsonInclude.Include.ALWAYS這個是默認策略,任何情況下都序列化該字段,和不寫這個注解是一樣的效果。
@Data @JsonInclude(JsonInclude.Include.NON_NULL) public class OrderDTO { private String orderId; private String buyerName; private String buyerPhone; private String buyerAddress; private String buyerOpenid; List<OrderDetail> orderDetailList;//null,不返回 }
如果多個類都需要不返回null,挨個加注釋太麻煩了,可以全局設置,更改配置文件application.yml
spring: jackson: default-property-inclusion: non_null
如果List<OrderDetail> orderDetailList;需要返回一個空的list,但不能返回null,可以直接初始化
List<OrderDetail> orderDetailList = new ArrayList<>();
同樣若要返回空字符而不是null,初始化
private String msr = ""; private String data;
JSON @JsonSerialize 棄用問題解決方案
@JsonSerialize棄用spring boot中,返回json默認是包含空串的,如果我們不想讓json返回null值,可以在bean上添加一些注解。
@JsonInclude(JsonInclude.Include.NON_EMPTY)??
后面的枚舉值可以為
ALWAYS, NON_NULL, // 屬性為NULL 不序列化,就是為null的字段不參加序列化 NON_ABSENT, // 屬性為默認值不序列化 NON_EMPTY, // 屬性為 空("") 或者為 NULL 都不序列化,則返回的json是沒有這個字段的。這樣對移動端會更省流量 NON_DEFAULT, CUSTOM, USE_DEFAULTS;
調用
@JsonInclude(JsonInclude.Include.NON_EMPTY) public class MsgBean {}
Ps:好多資料上說的@JsonSerialize這個注解已經被棄用了~
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/myjess/article/details/106491091