@JsonSerialize注解的使用示例教程
@JsonSerialize注解的使用
使用場景
** 在開發(fā)中,有時候某些字段需要特殊處理,比如我們有一個日期字段,當(dāng)日期為NULL時給前端不返回NULL而返回為其他等信息,就需要自定義字段的序列化。這就是@JsonSerialize的用處 **
1:先寫一個指定的處理類
package org.demo.common.json; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; import java.util.List; /** * * @Description: 序列化工具,將list集合轉(zhuǎn)字符串 * @Author: xqf * @Date: 2023-11-25 * @Version: V1.0 * / /**繼承JsonSerializer*/ public class ToArraysSerializer extends JsonSerializer<String> { /** * 重寫serialize方法 **/ @Override public void serialize(String object, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { /**自定義處理方式*/ List<String> list = JSONObject.parseObject(object, List.class); jsonGenerator.writeObject(list); } }
2:此字段上加上@JsonSerialize注解,并且使用using 屬性(表示有值的時候調(diào)用ToArraysSerializer處理返回給前端)
/** * 文章內(nèi)容 */ @ApiModelProperty(value = "文章內(nèi)容") @JsonSerialize(using = ToArraysSerializer.class) private String content;
3:nullsUsing用法與using 一樣,當(dāng)字段為NULL時的自定義序列化方式
/** * 文章內(nèi)容 */ @ApiModelProperty(value = "文章內(nèi)容") @JsonSerialize(nullsUsing = xxx.class) private String content;
擴展:
@JsonSerialize的使用
一、項目背景
在前后端分離的項目中,后端使用雪花算法生成的id,前端使用js來處理數(shù)據(jù)。如果使用傳統(tǒng)方式,在保存和響應(yīng)時加上轉(zhuǎn)換的處理,不難但是很繁瑣的操作令人很頭痛,jackson提供了JsonSerialize和JsonDeserialize注解來優(yōu)雅的解決這個問題,項目采用的springboot框架,而springboot框架默認(rèn)配置json轉(zhuǎn)換工具就是jackson。如此,使用注解解決問題很nice了。
也可以自己手動引入一個自己想要的版本
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> </dependency>
二、注解介紹
@JsonSerialize:json序列化注解,用于字段或get方法上,作用于getter()方法,將java對象序列化為json數(shù)據(jù)。
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) //include里面包含了序列化的范圍和作用的規(guī)則,本行作用是屬性為null的時候不進(jìn)行序列化操作。 @JsonSerialize(using = ToStringSerializer.class) //將id實現(xiàn)字符串的序列化和反序列序列化 @JsonSerialize(nullsUsing = DateJsonSerialize.class) //當(dāng)此字段為NULL時就使用我們自定義的解析類序列化此字段(注意當(dāng)此字段不為NULL時不執(zhí)行此配置) @JsonSerialize(using = Bean.class) //Bean 為實現(xiàn)類,Bean需要繼承JsonSerializer<>,泛型就是作用字段的類型。
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
對返回的json數(shù)據(jù)含有null值進(jìn)行過濾
過濾前
{ name: null, age: 22, sex: 'man' }
過濾后
{ age: 22, sex: 'man' }
@JsonSerialize(using = ToStringSerializer.class)
java
中id為long時,前端js傳到后臺就變了值,后兩位就變成了00;從網(wǎng)上查了資料才知道,后端使用雪花或是其他算法生成的id一般都在19位,而js
中number的最大長度為17位所以出現(xiàn)了這種烏龍的情況。解決這個問題就是在id上加上這個注解
@TableId(type = IdType.ASSIGN_ID) @JsonSerialize(using = ToStringSerializer.class) @ApiModelProperty(value = "id") private Long id;
@JsonSerialize(nullsUsing = DateJsonSerialize.class)
需要我們寫一個指定的處理類
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; import java.util.Date; //繼承JsonSerializer public class DateJsonSerialize extends JsonSerializer<Date> { //重寫serialize方法 @Override public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { //自定義處理方式 jsonGenerator.writeString("未完成"); } }
@JsonSerialize(using = Bean.class)
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; public class BeanSerializer extends JsonSerializer<MyBeanClass> { @Override public void serialize(MyBeanClass bean, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { // 在這里實現(xiàn)你自定義的序列化邏輯 // 使用 jsonGenerator 將對象的屬性按照你的需求寫入 JSON } }
然后,你可以將這個自定義的序列化器類BeanSerializer
應(yīng)用于你的Java對象,例如:
@Data @JsonSerialize(using = BeanSerializer.class)//①放到這 public class MyBeanClass { @JsonSerialize(using = BeanSerializer.class)//②放到這 private String name; }
到此這篇關(guān)于@JsonSerialize注解的使用的文章就介紹到這了,更多相關(guān)@JsonSerialize注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot2.1.6集成activiti7出現(xiàn)登錄驗證的實現(xiàn)
這篇文章主要介紹了Springboot2.1.6集成activiti7出現(xiàn)登錄驗證的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Spring中bean的生命周期之getSingleton方法
今天給大家?guī)淼氖顷P(guān)于Spring的相關(guān)知識,文章圍繞著Spring中bean的生命周期之getSingleton方法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06SpringCloud如何使用Eureka實現(xiàn)服務(wù)之間的傳遞數(shù)據(jù)
這篇文章主要介紹了SpringCloud使用Eureka實現(xiàn)服務(wù)之間的傳遞數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Java開發(fā)中synchronized的定義及用法詳解
這篇文章主要介紹了Java開發(fā)中synchronized的定義及用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07jsp+servlet實現(xiàn)簡單登錄頁面功能(附demo)
本文主要介紹了jsp+servlet實現(xiàn)簡單登錄頁面功能登錄成功跳轉(zhuǎn)新頁面,登錄失敗在原登錄界面提示登錄失敗信息,對初學(xué)者有一定的幫助,感興趣的可以了解一下2021-07-07Java中具有映射關(guān)系的容器:數(shù)組和Map的區(qū)別說明
這篇文章主要介紹了Java中具有映射關(guān)系的容器:數(shù)組和Map的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09