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

