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

配置SpringBoot中的Jackson序列化方式

 更新時間:2025年09月08日 09:00:22   作者:LOVE_DDZ  
本文介紹了在SpringBoot開發(fā)中,如何通過Jackson自定義JSON序列化和反序列化配置,解決常見問題,如日期格式、空值處理、數(shù)據(jù)精度等,總結(jié) Jackson默認行為通常滿足需求,但通過配置ObjectMapper和JsonConstants,可以靈活調(diào)整序列化邏輯,滿足具體應(yīng)用需求

在開發(fā)基于Spring Boot的應(yīng)用程序時,Jackson是默認的JSON序列化和反序列化工具。

它提供了強大的功能,可以靈活地處理JSON數(shù)據(jù)。然而,Jackson的默認行為可能無法完全滿足我們的需求。

例如,日期格式、空值處理、數(shù)據(jù)精度等問題可能需要自定義配置。本文將詳細介紹如何在Spring Boot中配置Jackson,以滿足這些需求。

1. 為什么需要自定義Jackson配置?

Jackson的默認行為在大多數(shù)情況下是合理的,但在實際開發(fā)中,我們可能需要對以下方面進行自定義:

  • 日期格式:默認情況下,Jackson會將日期序列化為時間戳,這可能不符合我們的需求。
  • 空值處理:默認情況下,Jackson會忽略空值,但我們可能需要保留空值。
  • 數(shù)據(jù)精度:對于BigDecimalBigInteger等類型,直接序列化可能會導(dǎo)致精度問題。
  • 自定義序列化:對于某些復(fù)雜類型,我們可能需要自定義序列化邏輯。

2. 配置JacksonConfig

在Spring Boot中,可以通過創(chuàng)建一個@Configuration類并定義一個ObjectMapper的Bean來自定義Jackson的行為。

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.TimeZone;

/**
 * @author XiaoXin
 */
@Configuration
public class JacksonConfig {

    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
        ObjectMapper objectMapper = builder.createXmlMapper(false)
                .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                .featuresToDisable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
                .timeZone(TimeZone.getTimeZone("Asia/Shanghai"))
                .build();
        // null數(shù)據(jù)返回
        objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 反序列化時候遇到不匹配的屬性并不拋出異常
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        // 序列化時候遇到空對象不拋出異常
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        // 反序列化的時候如果是無效子類型,不拋出異常
        objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
        // 不使用默認的dateTime進行序列化,
        objectMapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false);
        // 數(shù)據(jù)精度問題
        SimpleModule simpleModule = new SimpleModule()
                .addSerializer(Long.class, ToStringSerializer.instance)
                .addSerializer(Long.TYPE, ToStringSerializer.instance)
                .addSerializer(BigInteger.class, ToStringSerializer.instance)
                .addSerializer(BigDecimal.class, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        // 配置Java 8時間日期模塊
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        objectMapper.registerModule(javaTimeModule).registerModule(new ParameterNamesModule());
        return objectMapper;
    }
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring與mybatis三種整合方法

    spring與mybatis三種整合方法

    這篇文章主要介紹了spring與mybatis三種整合方法,需要的朋友可以參考下
    2017-04-04
  • jdk1.8的Jenkins安裝配置實踐

    jdk1.8的Jenkins安裝配置實踐

    Jenkins是一款流行的開源持續(xù)集成工具,支持自動構(gòu)建、測試和部署,通過Jenkins,開發(fā)團隊可以實現(xiàn)代碼提交后自動進行構(gòu)建、測試,并將構(gòu)建結(jié)果分發(fā)到測試或生產(chǎn)環(huán)境,Jenkins具有易于安裝和配置、豐富的插件支持、消息通知和測試報告等功能,通過配置Jenkins
    2025-12-12
  • Java中常用時間的一些相關(guān)方法

    Java中常用時間的一些相關(guān)方法

    日期的使用多種多樣,但萬變不離其宗,下面這篇文章主要給大家介紹了關(guān)于Java中常用時間的一些相關(guān)方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-10-10
  • SpringBoot?集成短信和郵件的配置示例詳解

    SpringBoot?集成短信和郵件的配置示例詳解

    這篇文章主要介紹了SpringBoot?集成短信和郵件的相關(guān)知識,項目中使用lombok插件和swagger依賴,無相關(guān)依賴的請自行修改,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • 關(guān)于SpringBoot自定義條件注解與自動配置

    關(guān)于SpringBoot自定義條件注解與自動配置

    這篇文章主要介紹了關(guān)于SpringBoot自定義條件注解與自動配置,Spring Boot的核心功能就是為整合第三方框架提供自動配置,而本文則帶著大家實現(xiàn)了自己的自動配置和Starter,需要的朋友可以參考下
    2023-07-07
  • 淺談Java內(nèi)存區(qū)域與對象創(chuàng)建過程

    淺談Java內(nèi)存區(qū)域與對象創(chuàng)建過程

    下面小編就為大家?guī)硪黄獪\談Java內(nèi)存區(qū)域與對象創(chuàng)建過程。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • ClassLoader雙親委派模式作用詳解

    ClassLoader雙親委派模式作用詳解

    這篇文章主要為大家介紹了ClassLoader雙親委派模式作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Integer IntegerCache源碼閱讀

    Integer IntegerCache源碼閱讀

    這篇文章主要介紹了Integer IntegerCache源碼閱讀,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Spring利用@Validated注解實現(xiàn)參數(shù)校驗詳解

    Spring利用@Validated注解實現(xiàn)參數(shù)校驗詳解

    這篇文章主要為大家詳細介紹了在?Spring?項目中使用?@Validated?進行參數(shù)校驗的方法和常見應(yīng)用場景,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • Java并發(fā)編程如何降低鎖粒度并實現(xiàn)性能優(yōu)化

    Java并發(fā)編程如何降低鎖粒度并實現(xiàn)性能優(yōu)化

    這篇文章主要介紹了Java并發(fā)編程如何降低鎖粒度并實現(xiàn)性能優(yōu)化,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08

最新評論

武隆县| 田林县| 郯城县| 抚顺市| 南和县| 军事| 宝丰县| 龙泉市| 翼城县| 清镇市| 巴彦淖尔市| 永顺县| 琼结县| 辛集市| 扬中市| 浪卡子县| 邵阳县| 比如县| 抚宁县| 鸡泽县| 营口市| 河津市| 张家口市| 鹤壁市| 绩溪县| 惠安县| 大冶市| 石狮市| 齐河县| 忻州市| 玉树县| 安多县| 红安县| 淮北市| 工布江达县| 罗平县| 从化市| 正定县| 松溪县| 元氏县| 上高县|