最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何自定義Jackson序列化?@JsonSerialize

 更新時(shí)間:2021年12月31日 08:50:01   作者:一笑而過(guò)者也  
這篇文章主要介紹了如何自定義Jackson序列化?@JsonSerialize,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

自定義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();
    }
}

測(cè)試:

jackson自定義全局序列化、反序列化

需要自定義Jackson序列化和反序列化有兩種方式,一種是全局定義,一種是非全局定義。先來(lái)看看全局定義。全局定義的步驟如下,以定義一個(gè)localDateTime的序列化和反序列化為例:

創(chuàng)建序列化類

創(chuàng)建一個(gè)序列化類然后繼承JsonSerializer,重寫serialize序列化方法。其中第一個(gè)參數(shù)localDateTime為JsonSerializer的泛型,表示的是被序列化的類型的值,第二個(gè)參數(shù)jsonGenerator表示的是用于輸出生成的Json內(nèi)容,第三個(gè)參數(shù)暫時(shí)沒明白什么應(yīng)用場(chǎ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的泛型對(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è)類注冊(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í)候沒有為屬性找到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í)候序列對(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指定使用的序列化、反序列化類。僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家

相關(guān)文章

  • Java IO字符流緩沖區(qū)實(shí)現(xiàn)原理解析

    Java IO字符流緩沖區(qū)實(shí)現(xiàn)原理解析

    這篇文章主要介紹了Java IO字符流緩沖區(qū)實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 深入理解Java編程線程池的實(shí)現(xiàn)原理

    深入理解Java編程線程池的實(shí)現(xiàn)原理

    這篇文章主要介紹了深入理解Java編程線程池的實(shí)現(xiàn)原理,涉及ThreadPoolExecutor類,線程池實(shí)現(xiàn)原理及示例等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 如何在spring boot項(xiàng)目中使用Spring Security的BCryptPasswordEncoder類進(jìn)行相同密碼不同密文的加密和驗(yàn)證

    如何在spring boot項(xiàng)目中使用Spring Security的BCryptPasswordE

    本文介紹如何在Spring Boot項(xiàng)目中通過(guò)修改pom.xml引入安全依賴,添加配置類以解除默認(rèn)的HTTP請(qǐng)求攔截,以及如何創(chuàng)建BCryptPasswordEncoder對(duì)象進(jìn)行密碼的加密和匹配,通過(guò)這些步驟,可以有效地增強(qiáng)應(yīng)用的安全性
    2023-08-08
  • Java生成word文檔的示例詳解

    Java生成word文檔的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言生成word文檔,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下
    2022-12-12
  • 淺談Spring中@Transactional事務(wù)回滾及示例(附源碼)

    淺談Spring中@Transactional事務(wù)回滾及示例(附源碼)

    本篇文章主要介紹了淺談Spring中@Transactional事務(wù)回滾及示例(附源碼),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • java中的transient關(guān)鍵字解讀

    java中的transient關(guān)鍵字解讀

    這篇文章主要介紹了java中的transient關(guān)鍵字解讀,transient關(guān)鍵字的主要作用就是讓某些被transient關(guān)鍵字修飾的成員屬性變量不被序列化,實(shí)際上也正是因此,在學(xué)習(xí)過(guò)程中很少用得上序列化操作,一般都是在實(shí)際開發(fā)中,需要的朋友可以參考下
    2023-09-09
  • IDEA如何在當(dāng)前類中查找方法快捷鍵

    IDEA如何在當(dāng)前類中查找方法快捷鍵

    這篇文章主要介紹了IDEA如何在當(dāng)前類中查找方法快捷鍵問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java中的跨域和@CrossOrigin注解的作用詳解

    Java中的跨域和@CrossOrigin注解的作用詳解

    這篇文章主要介紹了Java中的跨域和@CrossOrigin注解的作用詳解,跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript施加的安全限制,需要的朋友可以參考下
    2023-12-12
  • java處理按鈕點(diǎn)擊事件的方法

    java處理按鈕點(diǎn)擊事件的方法

    下面小編就為大家?guī)?lái)一篇java處理按鈕點(diǎn)擊事件的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • SpringBoot結(jié)合Redis實(shí)現(xiàn)會(huì)話管理功能

    SpringBoot結(jié)合Redis實(shí)現(xiàn)會(huì)話管理功能

    在Web應(yīng)用程序中,會(huì)話管理是一項(xiàng)重要的任務(wù),它涉及跟蹤用戶的身份驗(yàn)證狀態(tài)和其他相關(guān)信息,以確保用戶在與應(yīng)用程序交互時(shí)的連續(xù)性和安全性,在本文中,我們將探討如何使用Spring Boot和Redis實(shí)現(xiàn)高效的會(huì)話管理
    2023-06-06

最新評(píng)論

东方市| 涞源县| 大余县| 祁门县| 德庆县| 改则县| 两当县| 张家港市| 彰化市| 东光县| 海盐县| 瑞昌市| 黑水县| 丹江口市| 孟村| 古浪县| 石嘴山市| 资源县| 乐安县| 古田县| 东台市| 五台县| 马尔康县| 东安县| 富裕县| 武胜县| 深圳市| 浦城县| 汉沽区| 云梦县| 徐州市| 会东县| 鄂托克旗| 枝江市| 睢宁县| 岳阳市| 泾源县| 屏东市| 平陆县| 临沂市| 广东省|