@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框架默認配置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的時候不進行序列化操作。 @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值進行過濾
過濾前
{
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),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Spring中bean的生命周期之getSingleton方法
今天給大家?guī)淼氖顷P(guān)于Spring的相關(guān)知識,文章圍繞著Spring中bean的生命周期之getSingleton方法展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06
SpringCloud如何使用Eureka實現(xiàn)服務(wù)之間的傳遞數(shù)據(jù)
這篇文章主要介紹了SpringCloud使用Eureka實現(xiàn)服務(wù)之間的傳遞數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Java開發(fā)中synchronized的定義及用法詳解
這篇文章主要介紹了Java開發(fā)中synchronized的定義及用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
jsp+servlet實現(xiàn)簡單登錄頁面功能(附demo)
本文主要介紹了jsp+servlet實現(xiàn)簡單登錄頁面功能登錄成功跳轉(zhuǎn)新頁面,登錄失敗在原登錄界面提示登錄失敗信息,對初學(xué)者有一定的幫助,感興趣的可以了解一下2021-07-07
Java中具有映射關(guān)系的容器:數(shù)組和Map的區(qū)別說明
這篇文章主要介紹了Java中具有映射關(guān)系的容器:數(shù)組和Map的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09

