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