網(wǎng)站首頁 前端文檔 正文
自定義Jackson序列化 @JsonSerialize
自定義json序列化需要實(shí)現(xiàn)StdSerializer<T>或者JsonSerializer<T>。
我要序列化House這個(gè)類,加上注解,指定用于序列化的類
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序列化和反序列化有兩種方式,一種是全局定義,一種是非全局定義。先來看看全局定義。全局定義的步驟如下,以定義一個(gè)localDateTime的序列化和反序列化為例:
創(chuàng)建序列化類
創(chuàng)建一個(gè)序列化類然后繼承JsonSerializer,重寫serialize序列化方法。其中第一個(gè)參數(shù)localDateTime為JsonSerializer的泛型,表示的是被序列化的類型的值,第二個(gè)參數(shù)jsonGenerator表示的是用于輸出生成的Json內(nèi)容,第三個(gè)參數(shù)暫時(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)建兩個(gè)類,一個(gè)類繼承JsonDeserializer,一個(gè)類繼承KeyDeserializer,重寫deserialize反序列化方法。參數(shù)jsonParser用于讀取json內(nèi)容的解析,deserializationContext可用于訪問此有關(guān)反序列化的上下文(暫時(shí)也不知道怎么用),返回值則是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); } }
將兩個(gè)類注冊進(jìn)入jackson核心對象objectMapper
@Bean public ObjectMapper objectMapper(){ ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); //不注釋,會(huì)導(dǎo)致swagger報(bào)錯(cuò) //objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); //關(guān)閉日期序列化為時(shí)間戳的功能 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); //關(guān)閉序列化的時(shí)候沒有為屬性找到getter方法,報(bào)錯(cuò) objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); //關(guān)閉反序列化的時(shí)候,沒有找到屬性的setter報(bào)錯(cuò) objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); //序列化的時(shí)候序列對象的所有屬性 objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); //反序列化的時(shí)候如果多了其他屬性,不拋出異常 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //如果是空對象的時(shí)候,不拋異常 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é)一下
原文鏈接:https://blog.csdn.net/u012326462/article/details/83019881
相關(guān)推薦
- 2022-08-02 Python?生成器yield原理及用法_python
- 2022-09-22 集合Map以及HashMap
- 2022-10-16 QT網(wǎng)絡(luò)通信TCP客戶端實(shí)現(xiàn)詳解_C 語言
- 2023-01-13 分布式緩存Redis與Memcached的優(yōu)缺點(diǎn)區(qū)別比較_數(shù)據(jù)庫其它
- 2023-03-29 SVM算法的理解及其Python實(shí)現(xiàn)多分類和二分類問題_python
- 2022-06-07 python字符串的一些常見實(shí)用操作_python
- 2022-06-19 詳解.Net中字符串不變性與相等判斷的特殊場景_實(shí)用技巧
- 2023-04-27 React中useState值為對象時(shí)改變值不渲染問題_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支