@JsonSerialize注解的使用示例教程
@JsonSerialize注解的使用
使用場景
** 在開發(fā)中,有時候某些字段需要特殊處理,比如我們有一個日期字段,當日期為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集合轉字符串
* @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 屬性(表示有值的時候調用ToArraysSerializer處理返回給前端)
/**
* 文章內容
*/
@ApiModelProperty(value = "文章內容")
@JsonSerialize(using = ToArraysSerializer.class)
private String content;3:nullsUsing用法與using 一樣,當字段為NULL時的自定義序列化方式
/**
* 文章內容
*/
@ApiModelProperty(value = "文章內容")
@JsonSerialize(nullsUsing = xxx.class)
private String content;擴展:
@JsonSerialize的使用
一、項目背景
在前后端分離的項目中,后端使用雪花算法生成的id,前端使用js來處理數(shù)據(jù)。如果使用傳統(tǒng)方式,在保存和響應時加上轉換的處理,不難但是很繁瑣的操作令人很頭痛,jackson提供了JsonSerialize和JsonDeserialize注解來優(yōu)雅的解決這個問題,項目采用的springboot框架,而springboot框架默認配置json轉換工具就是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) //當此字段為NULL時就使用我們自定義的解析類序列化此字段(注意當此字段不為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應用于你的Java對象,例如:
@Data
@JsonSerialize(using = BeanSerializer.class)//①放到這
public class MyBeanClass {
@JsonSerialize(using = BeanSerializer.class)//②放到這
private String name;
}到此這篇關于@JsonSerialize注解的使用的文章就介紹到這了,更多相關@JsonSerialize注解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java 使用線程監(jiān)控文件目錄變化的實現(xiàn)方法
這篇文章主要介紹了java 使用線程監(jiān)控文件目錄變化的實現(xiàn)方法的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10
Java8新特性之lambda(動力節(jié)點Java學院整理)
這篇文章主要介紹了Java8新特性之lambda(動力節(jié)點Java學院整理)表達式的相關知識,包括lambda語法方面的知識,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-06-06
IDEA?Debug過程中使用Drop?Frame或Reset?Frame實現(xiàn)操作回退的方法
在IDEA中就提供了一個幫助你回退代碼的機會,但這個方法并不是萬能的,好了,下面就來具體說說IDEA?Debug過程中使用Drop?Frame或Reset?Frame實現(xiàn)操作回退的方法,感興趣的朋友一起看看吧2022-04-04
Mybatis攔截器注解@Intercepts與@Signature注解使用
本文主要介紹了Mybatis攔截器注解@Intercepts與@Signature注解使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-07-07
springboot中用fastjson處理返回值為null的屬性值
在本篇文章里小編給大家整理的是一篇關于springboot中用fastjson處理返回值問題詳解內容,需要的朋友們參考下。2020-03-03
SpringBoot 如何根據(jù)不同profile選擇不同配置
這篇文章主要介紹了SpringBoot 如何根據(jù)不同profile選擇不同配置的操作方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

