如何自定義Jackson序列化?@JsonSerialize
自定義Jackson序列化 @JsonSerialize
自定義json序列化需要實(shí)現(xiàn)StdSerializer<T>或者JsonSerializer<T>。
我要序列化House這個(gè)類(lèi),加上注解,指定用于序列化的類(lèi)
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(); } }
測(cè)試:
jackson自定義全局序列化、反序列化
需要自定義Jackson序列化和反序列化有兩種方式,一種是全局定義,一種是非全局定義。先來(lái)看看全局定義。全局定義的步驟如下,以定義一個(gè)localDateTime的序列化和反序列化為例:
創(chuàng)建序列化類(lèi)
創(chuàng)建一個(gè)序列化類(lèi)然后繼承JsonSerializer,重寫(xiě)serialize序列化方法。其中第一個(gè)參數(shù)localDateTime為JsonSerializer的泛型,表示的是被序列化的類(lèi)型的值,第二個(gè)參數(shù)jsonGenerator表示的是用于輸出生成的Json內(nèi)容,第三個(gè)參數(shù)暫時(shí)沒(méi)明白什么應(yīng)用場(chǎng)景。重寫(xiě)方法一般是將想要序列化的字符串傳入 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)建反序列化類(lèi)
創(chuàng)建兩個(gè)類(lèi),一個(gè)類(lèi)繼承JsonDeserializer,一個(gè)類(lèi)繼承KeyDeserializer,重寫(xiě)deserialize反序列化方法。參數(shù)jsonParser用于讀取json內(nèi)容的解析,deserializationContext可用于訪問(wèn)此有關(guān)反序列化的上下文(暫時(shí)也不知道怎么用),返回值則是JsonDeserializer的泛型對(duì)象,表示要反序列化的對(duì)象。一般用法是通過(guò)jsonParser.getText().trim()獲取該字段json字符串,然后將該字符串轉(zhuǎn)換為對(duì)象返回。
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è)類(lèi)注冊(cè)進(jìn)入jackson核心對(duì)象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í)候沒(méi)有為屬性找到getter方法,報(bào)錯(cuò) objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); //關(guān)閉反序列化的時(shí)候,沒(méi)有找到屬性的setter報(bào)錯(cuò) objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); //序列化的時(shí)候序列對(duì)象的所有屬性 objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); //反序列化的時(shí)候如果多了其他屬性,不拋出異常 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //如果是空對(duì)象的時(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é)一下
以上,通過(guò)objectMapper的配置,完成了全局序列化、反序列化的配置,如果不需要全局則通過(guò)@jsonserialize或 @JsonDeserialize指定使用的序列化、反序列化類(lèi)。僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家
- Jackson使用示例-Bean、XML、Json之間相互轉(zhuǎn)換
- 一篇文章了解Jackson注解@JsonFormat及失效解決辦法
- Java中對(duì)象?和?json?互轉(zhuǎn)四種方式?json-lib、Gson、FastJson、Jackson
- 利用Jackson解決Json序列化和反序列化問(wèn)題
- Java利用Jackson輕松處理JSON序列化與反序列化
- Jackson中json格式的字符串與對(duì)象的互相轉(zhuǎn)換方式
- JSON中fastjson、jackson、gson如何選擇
- jackson 如何將實(shí)體轉(zhuǎn)json json字符串轉(zhuǎn)實(shí)體
- 使用jackson實(shí)現(xiàn)對(duì)象json之間的相互轉(zhuǎn)換(spring boot)
- 使用Jackson-json解析一個(gè)嵌套的json字符串
- Jackson庫(kù)進(jìn)行JSON?序列化時(shí)遇到了無(wú)限遞歸(Infinite?Recursion)的問(wèn)題及解決方案
相關(guān)文章
Spring-全面詳解(學(xué)習(xí)總結(jié))
這篇文章主要介紹了詳解Spring框架入門(mén),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望能給你帶來(lái)幫助2021-07-07使用maven整合Spring+SpringMVC+Mybatis框架詳細(xì)步驟(圖文)
這篇文章主要介紹了使用maven整合Spring+SpringMVC+Mybatis框架詳細(xì)步驟(圖文),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05MyBatis查詢(xún)數(shù)據(jù),賦值給List集合時(shí),數(shù)據(jù)缺少的問(wèn)題及解決
這篇文章主要介紹了MyBatis查詢(xún)數(shù)據(jù),賦值給List集合時(shí),數(shù)據(jù)缺少的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01SpringBoot統(tǒng)一數(shù)據(jù)返回格式的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot統(tǒng)一數(shù)據(jù)返回格式,它提高了代碼的可維護(hù)性和一致性,并改善了客戶(hù)端與服務(wù)端之間的通信,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05java如何對(duì)map進(jìn)行排序詳解(map集合的使用)
這篇文章主要介紹了java如何對(duì)map進(jìn)行排序,java map集合的使用詳解,大家可以參考使用2013-12-12JAVA反射機(jī)制中g(shù)etClass和class對(duì)比分析
這篇文章主要介紹了JAVA反射機(jī)制中g(shù)etClass和class對(duì)比分析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11JAVA集成Freemarker生成靜態(tài)html過(guò)程解析
這篇文章主要介紹了JAVA集成Freemarker生成靜態(tài)html過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06