Springboot通過ObjectMapper配置json序列化詳解
前言
Spring Boot 默認集成了 Jackson,ObjectMapper 是 Jackson 庫中的一個核心類,它是用于將 Java 對象轉(zhuǎn)換為 JSON 字符串,以及將 JSON 字符串轉(zhuǎn)換回 Java 對象的主要工具。主要用于將數(shù)據(jù)格式化為指定格式,方便顯示。
一、ObjectMapper主要提供了以下方法
1、configure(SerializationFeature f, boolean state);//用于配置序列化、反序列化、JsonParser特性、JsonGenerator 特性,
2、enable(T f,T…)//啟用功能
3、disable(T f,T…)//禁用功能
4、 registerModule(Module module)//注冊序列化器
5、readValue(String content, Class valueType) //將 JSON 字符串反序列化為指定類型的 Java 對象。
6、writeValueAsString(Object value) //將 Java 對象序列化為 JSON 字符串。
//以上的T可以是SerializationFeature 、DeserializationFeature 、JsonParser.Feature、JsonGenerator.Feature
二、在springboot中全局配置json格式化
通過創(chuàng)建配置類,注冊一個ObjectMapper并且通過序列化器將日期轉(zhuǎn)換為指定格式,將Long類型轉(zhuǎn)換為字符串類型,同時以下配置也解決了接口接收未知數(shù)參數(shù)不拋出異常的問題,實際中大家可以復(fù)制下面代碼并且增加增加自己所需要的配置,其實相關(guān)json格式化的配置相當(dāng)多,大家有需要可以查詢源碼中的配置參數(shù)
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; 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 org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; /** * json處理 * @aphorism You are lucky to have someone to help you.No one to help you, is just fate.No one should do anything for you, because life is your own, you are responsible for yourself */ @Configuration public class JacksonHandle { private static final String DEFAULT_DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; private static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd"; private static final String DEFAULT_TIME_PATTERN = "HH:mm:ss"; @Bean @Primary public ObjectMapper objectMapper(){ ObjectMapper objectMapper = new ObjectMapper(); //日期序列化器 JavaTimeModule javaTimeModule = new JavaTimeModule(); //日期序列化 javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN))); javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN))); javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN))); //日期反序列化 javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN))); javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN))); javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN))); //反序列化-禁用在遇到未知屬性的時候拋出異常 objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); //注冊序列化器 objectMapper.registerModule(javaTimeModule); //自定義序列化器 SimpleModule module = new SimpleModule(); //添加將long序列化為string module.addSerializer(Long.class, new ToStringSerializer()); //注冊序列化器 objectMapper.registerModule(module); return objectMapper; } }
三、以下是我找到的一些具體配置的釋義,大家有需要可以參考
SerializationFeature配置參數(shù)
以下是序列化配置類SerializationFeature中的配置項的具體含義:
1. WRAP_ROOT_VALUE(false)
含義:如果序列化的Java對象是一個單一值(例如一個基本類型或字符串),則將其包裝在一個數(shù)組中。
默認值:false
示例:如果序列化一個字符串 “hello”,默認情況下輸出 “hello”;如果設(shè)置為 true,則輸出 [ “hello” ]。
2. INDENT_OUTPUT(false)
含義:是否對輸出的JSON進行縮進格式化,以提高可讀性。
默認值:false
示例:如果設(shè)置為 true,輸出的JSON將會被格式化,例如 { “name”: “John” } 變?yōu)椋?/p>
{ "name": "John" }
- FAIL_ON_EMPTY_BEANS(true)
含義:當(dāng)序列化空的Java Bean時是否拋出異常。
默認值:false
示例:如果序列化一個沒有字段的Java Bean,設(shè)置為 true 時會拋出異常。 - FAIL_ON_SELF_REFERENCES(true)
含義:當(dāng)序列化時遇到循環(huán)引用(即對象引用自身)是否拋出異常。
默認值:false
示例:如果序列化一個包含自身引用的對象,設(shè)置為 true 時會拋出異常。 - WRAP_EXCEPTIONS(true)
含義:是否將所有異常包裝為JsonMappingException。
默認值:false
示例:如果序列化過程中發(fā)生異常,默認情況下會直接拋出原始異常;如果設(shè)置為 true,則會包裝為JsonMappingException。 - FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS(true)
含義:當(dāng)反序列化時遇到未包裝的類型標識符是否拋出異常。
默認值:false
示例:如果反序列化時遇到未包裝的類型標識符,設(shè)置為 true 時會拋出異常。 - WRITE_SELF_REFERENCES_AS_NULL(false)
含義:當(dāng)序列化循環(huán)引用時是否將循環(huán)引用的對象序列化為null。
默認值:false
示例:如果序列化一個包含自身引用的對象,設(shè)置為 true 時會將循環(huán)引用的部分序列化為 null。 - CLOSE_CLOSEABLE(false)
含義:序列化完成后是否關(guān)閉Closeable類型的對象。
默認值:false
示例:如果序列化過程中使用了Closeable對象,設(shè)置為 true 時會在序列化完成后關(guān)閉這些對象。 - FLUSH_AFTER_WRITE_VALUE(true)
含義:每次序列化后是否立即刷新輸出流。
默認值:false
示例:如果設(shè)置為 true,每次序列化完成后都會立即刷新輸出流。 - WRITE_DATES_AS_TIMESTAMPS(true)
含義:日期是否以時間戳形式序列化。
默認值:true
示例:如果設(shè)置為 false,日期將以字符串形式序列化。 - WRITE_DATE_KEYS_AS_TIMESTAMPS(false)
含義:日期鍵是否以時間戳形式序列化。
默認值:false
示例:如果設(shè)置為 true,日期鍵將以時間戳形式序列化。 - WRITE_DATES_WITH_ZONE_ID(false)
含義:日期是否包含時區(qū)信息。
默認值:false
示例:如果設(shè)置為 true,日期序列化時會包含時區(qū)信息。 - WRITE_DATES_WITH_CONTEXT_TIME_ZONE(true)
含義:日期是否使用上下文中的時區(qū)進行序列化。
默認值:true
示例:如果設(shè)置為 false,日期將使用UTC時區(qū)進行序列化。 - WRITE_DURATIONS_AS_TIMESTAMPS(true)
含義:持續(xù)時間是否以時間戳形式序列化。
默認值:true
示例:如果設(shè)置為 false,持續(xù)時間將以字符串形式序列化。 - WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS(false)
含義:字符數(shù)組是否以JSON數(shù)組的形式序列化。
默認值:false
示例:如果設(shè)置為 true,字符數(shù)組將以JSON數(shù)組的形式序列化。 - WRITE_ENUMS_USING_TO_STRING(false)
含義:枚舉值是否使用其toString()方法的結(jié)果進行序列化。
默認值:false
示例:如果設(shè)置為 true,枚舉值將以其toString()結(jié)果進行序列化。 - WRITE_ENUMS_USING_INDEX(false)
含義:枚舉值是否使用其索引進行序列化。
默認值:false
示例:如果設(shè)置為 true,枚舉值將以其索引進行序列化。 - WRITE_ENUM_KEYS_USING_INDEX(false)
含義:枚舉鍵是否使用其索引進行序列化。
默認值:false
示例:如果設(shè)置為 true,枚舉鍵將以其索引進行序列化。
DeserializationFeature配置參數(shù)
- USE_BIG_DECIMAL_FOR_FLOATS
用途:當(dāng)序列化浮點數(shù)時,是否使用 BigDecimal 類型。
默認值:false — 使用 double 類型。 - USE_BIG_INTEGER_FOR_INTS
用途:當(dāng)序列化整數(shù)時,是否使用 BigInteger 類型。
默認值:false — 使用 long 類型。 - USE_LONG_FOR_INTS
用途:當(dāng)序列化整數(shù)時,是否使用 long 類型。
默認值:false — 使用 int 類型。 - USE_JAVA_ARRAY_FOR_JSON_ARRAY
用途:當(dāng)序列化 JSON 數(shù)組時,是否使用 Java 的數(shù)組類型。
默認值:false — 使用 JsonArray 類型。 - FAIL_ON_UNKNOWN_PROPERTIES
用途:當(dāng)遇到未知屬性時是否拋出異常。
默認值:true — 拋出異常。 - FAIL_ON_NULL_FOR_PRIMITIVES
用途:當(dāng)遇到原始類型的 null 值時是否拋出異常。
默認值:false — 不拋出異常。 - FAIL_ON_NUMBERS_FOR_ENUMS
用途:當(dāng)遇到枚舉類型的數(shù)字表示時是否拋出異常。
默認值:false — 不拋出異常。 - FAIL_ON_INVALID_SUBTYPE
用途:當(dāng)遇到無效子類型時是否拋出異常。
默認值:true — 拋出異常。 - FAIL_ON_READING_DUP_TREE_KEY
用途:當(dāng)讀取重復(fù)的樹鍵時是否拋出異常。
默認值:false — 不拋出異常。 - FAIL_ON_IGNORED_PROPERTIES
用途:當(dāng)遇到被忽略的屬性時是否拋出異常。
默認值:false — 不拋出異常。 - FAIL_ON_UNRESOLVED_OBJECT_IDS
用途:當(dāng)遇到未解決的對象 ID 時是否拋出異常。
默認值:true — 拋出異常。 - FAIL_ON_MISSING_CREATOR_PROPERTIES
用途:當(dāng)缺少構(gòu)造器屬性時是否拋出異常。
默認值:false — 不拋出異常。 - FAIL_ON_NULL_CREATOR_PROPERTIES
用途:當(dāng)構(gòu)造器屬性為 null 時是否拋出異常。
默認值:false — 不拋出異常。 - FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY
用途:當(dāng)缺少外部類型 ID 屬性時是否拋出異常。
默認值:true — 拋出異常。 - FAIL_ON_TRAILING_TOKENS
用途:當(dāng)遇到尾隨標記時是否拋出異常。
默認值:false — 不拋出異常。 - WRAP_EXCEPTIONS
用途:是否包裝異常。
默認值:true — 包裝異常。 - ACCEPT_SINGLE_VALUE_AS_ARRAY
用途:是否接受單個值作為數(shù)組。
默認值:false — 不接受。 - UNWRAP_SINGLE_VALUE_ARRAYS
用途:是否解包單值數(shù)組。
默認值:false — 不解包。 - UNWRAP_ROOT_VALUE
用途:是否解包根值。
默認值:false — 不解包。 - ACCEPT_EMPTY_STRING_AS_NULL_OBJECT
用途:是否接受空字符串作為 null 對象。
默認值:false — 不接受。 - ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT
用途:是否接受空數(shù)組作為 null 對象。
默認值:false — 不接受。 - ACCEPT_FLOAT_AS_INT
用途:是否接受浮點數(shù)作為整數(shù)。
默認值:true — 接受。 - READ_ENUMS_USING_TO_STRING
用途:是否使用 toString() 方法讀取枚舉。
默認值:false — 不使用。 - READ_UNKNOWN_ENUM_VALUES_AS_NULL
用途:是否將未知枚舉值讀取為 null。
默認值:false — 不讀取為 null。 - READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE
用途:是否使用默認值讀取未知枚舉值。
默認值:false — 不使用默認值。 - READ_DATE_TIMESTAMPS_AS_NANOSECONDS
用途:是否將日期時間戳讀取為納秒。
默認值:true — 讀取為納秒。 - ADJUST_DATES_TO_CONTEXT_TIME_ZONE
用途:是否調(diào)整日期到上下文時區(qū)。
默認值:true — 調(diào)整。 - EAGER_DESERIALIZER_FETCH
用途:是否急切地獲取反序列化器。
默認值:true — 急切獲取。
到此這篇關(guān)于Springboot通過ObjectMapper配置json序列化詳解的文章就介紹到這了,更多相關(guān)Springboot ObjectMapper配置json序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud?eureka(server)微服務(wù)集群搭建過程
這篇文章主要介紹了微服務(wù)SpringCloud-eureka(server)集群搭建,?項目搭建的主要步驟和配置就是創(chuàng)建項目和引入pom依賴,本文通過圖文示例代碼相結(jié)合給大家介紹的非常詳細,需要的朋友可以參考下2022-07-07SpringCloud?Gateway實現(xiàn)請求解密和響應(yīng)加密的過程解析
這篇文章主要介紹了SpringCloud?Gateway實現(xiàn)請求解密和響應(yīng)加密的相關(guān)知識,本文環(huán)境使用比較新的?Java?17?和?SpringBoot?3.1.5,對應(yīng)到Spring的版本是?6.0.13,本文重心是網(wǎng)關(guān)項目,需要的朋友可以參考下2023-11-11Java數(shù)據(jù)庫連接PreparedStatement的使用詳解
這篇文章主要介紹了Java數(shù)據(jù)庫連接PreparedStatement的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08Spring?Data?Elasticsearch?5.0.x修改數(shù)據(jù)后無法立即刷新解決方法示例
這篇文章主要為大家介紹了Spring?Data?Elasticsearch?5.0.x修改數(shù)據(jù)后無法立即刷新解決方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08Java實現(xiàn)經(jīng)典游戲2048的示例代碼
2014年Gabriele Cirulli利用周末的時間寫2048這個游戲的程序。本文將用java語言實現(xiàn)這一經(jīng)典游戲,并采用了swing技術(shù)進行了界面化處理,需要的可以參考一下2022-02-02