如何自定義Jackson序列化?@JsonSerialize
自定義Jackson序列化 @JsonSerialize
自定義json序列化需要實現(xiàn)StdSerializer<T>或者JsonSerializer<T>。
我要序列化House這個類,加上注解,指定用于序列化的類
package com.xhx.json.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.xhx.json.serializers.HourseSerializer;
import java.util.Date;
@JsonSerialize(using = HourseSerializer.class)
public class Hourse {
private String location;
private Date buildDate;
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public Date getBuildDate() {
return buildDate;
}
public void setBuildDate(Date buildDate) {
this.buildDate = buildDate;
}
}
package com.xhx.json.serializers;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.xhx.json.entity.Hourse;
import java.io.IOException;
public class HourseSerializer extends StdSerializer<Hourse> {
public HourseSerializer(){
super(Hourse.class);
}
protected HourseSerializer(Class<Hourse> t) {
super(t);
}
@Override
public void serialize(Hourse hourse, JsonGenerator generator, SerializerProvider provider) throws IOException {
generator.writeStartObject();
generator.writeFieldName("id");
generator.writeString("自定義");
generator.writeFieldName("location");
generator.writeString(hourse.getLocation());
generator.writeObjectField("buildDate",hourse.getBuildDate());
generator.writeEndObject();
}
}
測試:

jackson自定義全局序列化、反序列化
需要自定義Jackson序列化和反序列化有兩種方式,一種是全局定義,一種是非全局定義。先來看看全局定義。全局定義的步驟如下,以定義一個localDateTime的序列化和反序列化為例:
創(chuàng)建序列化類
創(chuàng)建一個序列化類然后繼承JsonSerializer,重寫serialize序列化方法。其中第一個參數(shù)localDateTime為JsonSerializer的泛型,表示的是被序列化的類型的值,第二個參數(shù)jsonGenerator表示的是用于輸出生成的Json內(nèi)容,第三個參數(shù)暫時沒明白什么應(yīng)用場景。重寫方法一般是將想要序列化的字符串傳入 jsonGenerator.writeString。
public final class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
public static final LocalDateTimeSerializer INSTANCE = new LocalDateTimeSerializer();
public LocalDateTimeSerializer() {
}
@Override
public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeString(DateUtil.format(localDateTime, DateUtil.DateTimeFormatEnum.DATE_TIME_FORMAT_4));
}
}
創(chuàng)建反序列化類
創(chuàng)建兩個類,一個類繼承JsonDeserializer,一個類繼承KeyDeserializer,重寫deserialize反序列化方法。參數(shù)jsonParser用于讀取json內(nèi)容的解析,deserializationContext可用于訪問此有關(guān)反序列化的上下文(暫時也不知道怎么用),返回值則是JsonDeserializer的泛型對象,表示要反序列化的對象。一般用法是通過jsonParser.getText().trim()獲取該字段json字符串,然后將該字符串轉(zhuǎn)換為對象返回。
public final class LocalTimeDeserializer extends JsonDeserializer<LocalTime> {
public static final LocalTimeDeserializer INSTANCE = new LocalTimeDeserializer();
public LocalTimeDeserializer() {
}
@Override
public LocalTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
String text = jsonParser.getText().trim();
return LocalTime.parse(text, DateUtil.DATE_TIME_FORMATTER_6);
}
}
public final class LocalDateTimeKeyDeserializer extends KeyDeserializer {
public static final LocalDateTimeKeyDeserializer INSTANCE = new LocalDateTimeKeyDeserializer();
public LocalDateTimeKeyDeserializer() {
}
@Override
public Object deserializeKey(String s, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
return StringUtils.isBlank(s) ? null : LocalDateTime.parse(s, DateUtil.DATE_TIME_FORMATTER_4);
}
}
將兩個類注冊進入jackson核心對象objectMapper
@Bean
public ObjectMapper objectMapper(){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//不注釋,會導(dǎo)致swagger報錯
//objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//關(guān)閉日期序列化為時間戳的功能
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
//關(guān)閉序列化的時候沒有為屬性找到getter方法,報錯
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
//關(guān)閉反序列化的時候,沒有找到屬性的setter報錯
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
//序列化的時候序列對象的所有屬性
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
//反序列化的時候如果多了其他屬性,不拋出異常
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//如果是空對象的時候,不拋異常
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
SimpleModule simpleModule = new SimpleModule();
//json值序列化
simpleModule.addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE);
//json值反序列化
simpleModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);
//json鍵序列化
simpleModule.addKeySerializer(LocalDateTime.class,LocalDateTimeSerializer.INSTANCE);
//json鍵反序列化
simpleModule.addKeyDeserializer(LocalDateTime.class, LocalDateTimeKeyDeserializer.INSTANCE);
objectMapper.registerModule(simpleModule);
return objectMapper;
}
小結(jié)一下
以上,通過objectMapper的配置,完成了全局序列化、反序列化的配置,如果不需要全局則通過@jsonserialize或 @JsonDeserialize指定使用的序列化、反序列化類。僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家
- Jackson使用示例-Bean、XML、Json之間相互轉(zhuǎn)換
- 一篇文章了解Jackson注解@JsonFormat及失效解決辦法
- Java中對象?和?json?互轉(zhuǎn)四種方式?json-lib、Gson、FastJson、Jackson
- 利用Jackson解決Json序列化和反序列化問題
- Java利用Jackson輕松處理JSON序列化與反序列化
- Jackson中json格式的字符串與對象的互相轉(zhuǎn)換方式
- JSON中fastjson、jackson、gson如何選擇
- jackson 如何將實體轉(zhuǎn)json json字符串轉(zhuǎn)實體
- 使用jackson實現(xiàn)對象json之間的相互轉(zhuǎn)換(spring boot)
- 使用Jackson-json解析一個嵌套的json字符串
- Jackson庫進行JSON?序列化時遇到了無限遞歸(Infinite?Recursion)的問題及解決方案
相關(guān)文章
如何在spring boot項目中使用Spring Security的BCryptPasswordE
本文介紹如何在Spring Boot項目中通過修改pom.xml引入安全依賴,添加配置類以解除默認(rèn)的HTTP請求攔截,以及如何創(chuàng)建BCryptPasswordEncoder對象進行密碼的加密和匹配,通過這些步驟,可以有效地增強應(yīng)用的安全性2023-08-08
淺談Spring中@Transactional事務(wù)回滾及示例(附源碼)
本篇文章主要介紹了淺談Spring中@Transactional事務(wù)回滾及示例(附源碼),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12
SpringBoot結(jié)合Redis實現(xiàn)會話管理功能
在Web應(yīng)用程序中,會話管理是一項重要的任務(wù),它涉及跟蹤用戶的身份驗證狀態(tài)和其他相關(guān)信息,以確保用戶在與應(yīng)用程序交互時的連續(xù)性和安全性,在本文中,我們將探討如何使用Spring Boot和Redis實現(xiàn)高效的會話管理2023-06-06

