Springboot通過ObjectMapper配置json序列化詳解
前言
Spring Boot 默認(rèn)集成了 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ù)組中。
默認(rèn)值:false
示例:如果序列化一個字符串 “hello”,默認(rèn)情況下輸出 “hello”;如果設(shè)置為 true,則輸出 [ “hello” ]。
2. INDENT_OUTPUT(false)
含義:是否對輸出的JSON進行縮進格式化,以提高可讀性。
默認(rèn)值:false
示例:如果設(shè)置為 true,輸出的JSON將會被格式化,例如 { “name”: “John” } 變?yōu)椋?/p>
{
"name": "John"
}- FAIL_ON_EMPTY_BEANS(true)
含義:當(dāng)序列化空的Java Bean時是否拋出異常。
默認(rèn)值:false
示例:如果序列化一個沒有字段的Java Bean,設(shè)置為 true 時會拋出異常。 - FAIL_ON_SELF_REFERENCES(true)
含義:當(dāng)序列化時遇到循環(huán)引用(即對象引用自身)是否拋出異常。
默認(rèn)值:false
示例:如果序列化一個包含自身引用的對象,設(shè)置為 true 時會拋出異常。 - WRAP_EXCEPTIONS(true)
含義:是否將所有異常包裝為JsonMappingException。
默認(rèn)值:false
示例:如果序列化過程中發(fā)生異常,默認(rèn)情況下會直接拋出原始異常;如果設(shè)置為 true,則會包裝為JsonMappingException。 - FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS(true)
含義:當(dāng)反序列化時遇到未包裝的類型標(biāo)識符是否拋出異常。
默認(rèn)值:false
示例:如果反序列化時遇到未包裝的類型標(biāo)識符,設(shè)置為 true 時會拋出異常。 - WRITE_SELF_REFERENCES_AS_NULL(false)
含義:當(dāng)序列化循環(huán)引用時是否將循環(huán)引用的對象序列化為null。
默認(rèn)值:false
示例:如果序列化一個包含自身引用的對象,設(shè)置為 true 時會將循環(huán)引用的部分序列化為 null。 - CLOSE_CLOSEABLE(false)
含義:序列化完成后是否關(guān)閉Closeable類型的對象。
默認(rèn)值:false
示例:如果序列化過程中使用了Closeable對象,設(shè)置為 true 時會在序列化完成后關(guān)閉這些對象。 - FLUSH_AFTER_WRITE_VALUE(true)
含義:每次序列化后是否立即刷新輸出流。
默認(rèn)值:false
示例:如果設(shè)置為 true,每次序列化完成后都會立即刷新輸出流。 - WRITE_DATES_AS_TIMESTAMPS(true)
含義:日期是否以時間戳形式序列化。
默認(rèn)值:true
示例:如果設(shè)置為 false,日期將以字符串形式序列化。 - WRITE_DATE_KEYS_AS_TIMESTAMPS(false)
含義:日期鍵是否以時間戳形式序列化。
默認(rèn)值:false
示例:如果設(shè)置為 true,日期鍵將以時間戳形式序列化。 - WRITE_DATES_WITH_ZONE_ID(false)
含義:日期是否包含時區(qū)信息。
默認(rèn)值:false
示例:如果設(shè)置為 true,日期序列化時會包含時區(qū)信息。 - WRITE_DATES_WITH_CONTEXT_TIME_ZONE(true)
含義:日期是否使用上下文中的時區(qū)進行序列化。
默認(rèn)值:true
示例:如果設(shè)置為 false,日期將使用UTC時區(qū)進行序列化。 - WRITE_DURATIONS_AS_TIMESTAMPS(true)
含義:持續(xù)時間是否以時間戳形式序列化。
默認(rèn)值:true
示例:如果設(shè)置為 false,持續(xù)時間將以字符串形式序列化。 - 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é)果進行序列化。
默認(rèn)值:false
示例:如果設(shè)置為 true,枚舉值將以其toString()結(jié)果進行序列化。 - WRITE_ENUMS_USING_INDEX(false)
含義:枚舉值是否使用其索引進行序列化。
默認(rèn)值:false
示例:如果設(shè)置為 true,枚舉值將以其索引進行序列化。 - WRITE_ENUM_KEYS_USING_INDEX(false)
含義:枚舉鍵是否使用其索引進行序列化。
默認(rèn)值:false
示例:如果設(shè)置為 true,枚舉鍵將以其索引進行序列化。
DeserializationFeature配置參數(shù)
- USE_BIG_DECIMAL_FOR_FLOATS
用途:當(dāng)序列化浮點數(shù)時,是否使用 BigDecimal 類型。
默認(rèn)值:false — 使用 double 類型。 - USE_BIG_INTEGER_FOR_INTS
用途:當(dāng)序列化整數(shù)時,是否使用 BigInteger 類型。
默認(rèn)值:false — 使用 long 類型。 - USE_LONG_FOR_INTS
用途:當(dāng)序列化整數(shù)時,是否使用 long 類型。
默認(rèn)值:false — 使用 int 類型。 - USE_JAVA_ARRAY_FOR_JSON_ARRAY
用途:當(dāng)序列化 JSON 數(shù)組時,是否使用 Java 的數(shù)組類型。
默認(rèn)值:false — 使用 JsonArray 類型。 - FAIL_ON_UNKNOWN_PROPERTIES
用途:當(dāng)遇到未知屬性時是否拋出異常。
默認(rèn)值:true — 拋出異常。 - FAIL_ON_NULL_FOR_PRIMITIVES
用途:當(dāng)遇到原始類型的 null 值時是否拋出異常。
默認(rèn)值:false — 不拋出異常。 - FAIL_ON_NUMBERS_FOR_ENUMS
用途:當(dāng)遇到枚舉類型的數(shù)字表示時是否拋出異常。
默認(rèn)值:false — 不拋出異常。 - FAIL_ON_INVALID_SUBTYPE
用途:當(dāng)遇到無效子類型時是否拋出異常。
默認(rèn)值:true — 拋出異常。 - FAIL_ON_READING_DUP_TREE_KEY
用途:當(dāng)讀取重復(fù)的樹鍵時是否拋出異常。
默認(rèn)值:false — 不拋出異常。 - FAIL_ON_IGNORED_PROPERTIES
用途:當(dāng)遇到被忽略的屬性時是否拋出異常。
默認(rèn)值:false — 不拋出異常。 - FAIL_ON_UNRESOLVED_OBJECT_IDS
用途:當(dāng)遇到未解決的對象 ID 時是否拋出異常。
默認(rèn)值:true — 拋出異常。 - FAIL_ON_MISSING_CREATOR_PROPERTIES
用途:當(dāng)缺少構(gòu)造器屬性時是否拋出異常。
默認(rèn)值:false — 不拋出異常。 - FAIL_ON_NULL_CREATOR_PROPERTIES
用途:當(dāng)構(gòu)造器屬性為 null 時是否拋出異常。
默認(rèn)值:false — 不拋出異常。 - FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY
用途:當(dāng)缺少外部類型 ID 屬性時是否拋出異常。
默認(rèn)值:true — 拋出異常。 - FAIL_ON_TRAILING_TOKENS
用途:當(dāng)遇到尾隨標(biāo)記時是否拋出異常。
默認(rèn)值:false — 不拋出異常。 - WRAP_EXCEPTIONS
用途:是否包裝異常。
默認(rèn)值:true — 包裝異常。 - ACCEPT_SINGLE_VALUE_AS_ARRAY
用途:是否接受單個值作為數(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 對象。
默認(rèn)值:false — 不接受。 - ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT
用途:是否接受空數(shù)組作為 null 對象。
默認(rèn)值:false — 不接受。 - ACCEPT_FLOAT_AS_INT
用途:是否接受浮點數(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
用途:是否將日期時間戳讀取為納秒。
默認(rèn)值:true — 讀取為納秒。 - ADJUST_DATES_TO_CONTEXT_TIME_ZONE
用途:是否調(diào)整日期到上下文時區(qū)。
默認(rèn)值:true — 調(diào)整。 - EAGER_DESERIALIZER_FETCH
用途:是否急切地獲取反序列化器。
默認(rèn)值:true — 急切獲取。
到此這篇關(guān)于Springboot通過ObjectMapper配置json序列化詳解的文章就介紹到這了,更多相關(guān)Springboot ObjectMapper配置json序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JavaScript中利用Array和Object實現(xiàn)Map的方法
- 使用ObjectMapper把Json轉(zhuǎn)換為復(fù)雜的實體類
- JavaScript中Object、map、weakmap的區(qū)別分析
- JavaScript 中有了Object 為什么還需要 Map 呢
- JavaScript?Map?和?Object?的區(qū)別解析
- JavaScript中Map與Object應(yīng)用場景
- JS中Map、WeakMap和Object的區(qū)別解析
- Javascript中Object和Map之間的轉(zhuǎn)換方法
- 面試???js中 Map和 Object 的區(qū)別小結(jié)
相關(guān)文章
Java根據(jù)開始時間和結(jié)束時間及周幾計算日期的示例代碼
在Java 7中,java.time包不存在,所以我們需要使用java.util.Calendar和java.util.Date類來實現(xiàn)類似的功能,這篇文章主要介紹了Java根據(jù)開始時間和結(jié)束時間及周幾計算出日期的示例代碼,需要的朋友可以參考下2024-06-06
IDEA 2020 無法啟動的解決辦法(啟動崩盤)附IDEA 2020 新功能
這篇文章主要介紹了IDEA 2020 無法啟動的解決辦法(啟動崩盤)附IDEA 2020 新功能,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
Springboot打包代碼,反編譯后代碼混淆方式(防止還原代碼)
文章主要介紹了如何對Spring Boot項目進行jar包混淆,以防止反編譯還原原始代碼,通過在項目中添加proguard.cfg文件并配置Maven插件,可以實現(xiàn)代碼混淆,從而增加反編譯的難度2024-11-11

