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

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

 更新時間:2021年12月31日 08:50:01   作者:一笑而過者也  
這篇文章主要介紹了如何自定義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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家

相關(guān)文章

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

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

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

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

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

    如何在spring boot項目中使用Spring Security的BCryptPasswordE

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

    Java生成word文檔的示例詳解

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

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

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

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

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

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

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

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

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

    java處理按鈕點擊事件的方法

    下面小編就為大家?guī)硪黄猨ava處理按鈕點擊事件的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • SpringBoot結(jié)合Redis實現(xiàn)會話管理功能

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

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

最新評論

庆安县| 麻栗坡县| 高台县| 安化县| 成都市| 拉萨市| 云浮市| 柘城县| 元谋县| 堆龙德庆县| 搜索| 临夏市| 定州市| 九台市| 肇州县| 海兴县| 青阳县| 洪洞县| 涿州市| 贵定县| 化州市| 崇阳县| 浦城县| 镇原县| 永定县| 福贡县| 繁峙县| 丹棱县| 沛县| 安宁市| 巴林左旗| 兴文县| 阳城县| 洞头县| 丰顺县| 松原市| 灵山县| 广西| 宁陵县| 泽州县| 手机|