SpringBoot中fastjson自定義序列化和反序列化的實(shí)戰(zhàn)分享
1. 擴(kuò)展點(diǎn)的用途
fastjson提供的這些擴(kuò)展點(diǎn)為用戶提供了極大的靈活性,可以根據(jù)實(shí)際需求定制序列化和反序列化的行為。SpringBoot和SpringClould環(huán)境中,可以通過(guò)SerializeFilter和ParserProcess定制復(fù)雜的序列化和反序列化邏輯,通過(guò)SerializerFeature和ParserFeature控制序列化和反序列化的輸出格式和特性,以及通過(guò)SerializeConfig和ParserConfig進(jìn)行全局配置。這些擴(kuò)展點(diǎn)不僅簡(jiǎn)化了用戶代碼,也提高了系統(tǒng)的可維護(hù)性和可擴(kuò)展性。
2. 序列化擴(kuò)展點(diǎn)
2.1. SerializeFilter
- 用途:用于在序列化過(guò)程中定制輸出,如過(guò)濾某些字段、修改字段值等。
- 使用方法:
- 實(shí)現(xiàn)
SerializeFilter
接口或其子接口(如SimplePropertyPreFilter
、PropertyFilter
等)。 - 在序列化時(shí),通過(guò)
JSON.toJSONString
等方法的重載版本傳入自定義的SerializeFilter
實(shí)例。
- 實(shí)現(xiàn)
SerializeFilter filter = new SimplePropertyPreFilter() { @Override public boolean accept(int index, JavaBeanSerializer beanSer, Object object, Object fieldName, Object fieldVal) { // 定制序列化邏輯 return true; // 返回true表示保留該字段,false表示過(guò)濾 } }; String jsonStr = JSON.toJSONString(obj, filter);
2.2. SerializerFeature
- 用途:控制序列化的輸出格式和特性。
- 使用方法:
- 在序列化時(shí),通過(guò)
JSON.toJSONString
等方法的重載版本傳入SerializerFeature
枚舉值來(lái)控制序列化特性。
- 在序列化時(shí),通過(guò)
String jsonStr = JSON.toJSONString(obj, SerializerFeature.PrettyFormat); // 格式化輸出
2.3. SerializeConfig
- 用途:全局配置序列化行為,如自定義序列化器、日期格式等。
- 使用方法:
- 創(chuàng)建
SerializeConfig
實(shí)例并配置相關(guān)選項(xiàng)。 - 在序列化時(shí),通過(guò)
JSON.toJSONString
等方法的重載版本傳入SerializeConfig
實(shí)例。
- 創(chuàng)建
SerializeConfig config = new SerializeConfig(); // 配置... String jsonStr = JSON.toJSONString(obj, config);
2.4. 自定義序列化器(Serializer)
fastjson允許用戶自定義序列化器,用于控制特定類型的序列化過(guò)程。用戶需要實(shí)現(xiàn)SerializerFeature
接口,并重寫(xiě)write
方法。
public class CustomSerializer implements SerializerFeature { @Override public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { // 自定義序列化邏輯 } }
在序列化過(guò)程中,可以通過(guò)SerializerFeature
枚舉值來(lái)指定使用自定義序列化器。
String jsonStr = JSON.toJSONString(obj, SerializerFeature.CustomSerializer, new CustomSerializer());
2.5. 序列化過(guò)濾器(SerializeFilter)
序列化過(guò)濾器用于在序列化過(guò)程中修改序列化結(jié)果。用戶需要實(shí)現(xiàn)SerializeFilter
接口,并重寫(xiě)process
方法。
public class CustomSerializeFilter implements SerializeFilter { @Override public boolean process(Object source, String name, Object value, SerializeFilter.Context context) { // 自定義序列化過(guò)濾邏輯 } }
在序列化過(guò)程中,可以通過(guò)JSON.toJSONString
方法的重載版本傳入自定義序列化過(guò)濾器。
String jsonStr = JSON.toJSONString(obj, new CustomSerializeFilter());
2.6. 自定義日期格式化
fastjson允許用戶自定義日期格式??梢酝ㄟ^(guò)SerializerFeature
枚舉值DisableCircularReferenceDetect
和WriteMapNullValue
來(lái)指定日期格式。
String jsonStr = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue);
此外,用戶還可以通過(guò)DateFormat
屬性來(lái)指定全局的日期格式。
JSON.setDateFormat(new StdDateFormat());
3. 反序列化擴(kuò)展點(diǎn)
3.1. ParseProcess
用途:在反序列化過(guò)程中執(zhí)行額外邏輯,如修改反序列化結(jié)果。
使用方法:
- 實(shí)現(xiàn)
ParseProcess
接口并重寫(xiě)其中的方法。 - 在反序列化時(shí),通過(guò)
JSON.parseObject
等方法的重載版本傳入ParseProcess
實(shí)例。
- 實(shí)現(xiàn)
- ParserFeature
- 用途:控制反序列化的行為和特性。
- 使用方法:
- 在反序列化時(shí),通過(guò)
JSON.parseObject
等方法的重載版本傳入ParserFeature
枚舉值來(lái)控制反序列化特性。
- 在反序列化時(shí),通過(guò)
Object obj = JSON.parseObject(jsonStr, Object.class, Feature.AllowSingleQuotes); // 允許使用單引號(hào)
3.2. ParserConfig
- 用途:全局配置反序列化行為,如自定義反序列化器、自動(dòng)類型轉(zhuǎn)換等。
- 使用方法:
- 創(chuàng)建
ParserConfig
實(shí)例并配置相關(guān)選項(xiàng)。 - 在反序列化時(shí),通過(guò)
JSON.parseObject
等方法的重載版本傳入ParserConfig
實(shí)例。
- 創(chuàng)建
ParserConfig config = new ParserConfig(); // 配置... Object obj = JSON.parseObject(jsonStr, Object.class, config);
示例代碼
這里提供一個(gè)簡(jiǎn)單的SerializeFilter
示例,用于過(guò)濾某些字段:
SerializeFilter filter = new SimplePropertyPreFilter() { @Override public boolean accept(int index, JavaBeanSerializer beanSer, Object object, Object fieldName, Object fieldVal) { if ("password".equals(fieldName)) { return false; // 過(guò)濾password字段 } return true; } }; String jsonStr = JSON.toJSONString(user, filter);
3.3. 自定義反序列化器(Deserializer)
類似地,fastjson也支持自定義反序列化器。用戶需要實(shí)現(xiàn)ObjectDeserializer
接口,并重寫(xiě)deserialze
方法。
public class CustomDeserializer implements ObjectDeserializer { @Override public Object deserialize(DefaultJSONParser parser, Type type, Object fieldName) { // 自定義反序列化邏輯 } }
在反序列化過(guò)程中,可以通過(guò)ParserConfig
類的putDeserializer
方法來(lái)注冊(cè)自定義反序列化器。
ParserConfig.getGlobalInstance().putDeserializer(SomeType.class, new CustomDeserializer());
3.4. 解析過(guò)程(ParseProcess)
解析過(guò)程在反序列化過(guò)程中使用,用戶可以實(shí)現(xiàn)ParseProcess
接口并重寫(xiě)process
方法來(lái)自定義解析邏輯。
public class CustomParseProcess implements ParseProcess { @Override public Object process(ParseContext ctx) { // 自定義解析邏輯 } }
在反序列化過(guò)程中,可以通過(guò)JSON.parseObject
方法的重載版本傳入自定義解析過(guò)程。
Object obj = JSON.parseObject(jsonStr, SomeType.class, new CustomParseProcess());
總之,SpringBoot和SpringClould環(huán)境中,可以通過(guò)SerializeFilter和ParserProcess定制復(fù)雜的序列化和反序列化邏輯,通過(guò)SerializerFeature和ParserFeature控制序列化和反序列化的輸出格式和特性,以及通過(guò)SerializeConfig和ParserConfig進(jìn)行全局配置。這些擴(kuò)展點(diǎn)不僅簡(jiǎn)化了用戶代碼,也提高了系統(tǒng)的可維護(hù)性和可擴(kuò)展性。
以上就是SpringBoot中fastjson自定義序列化和反序列化的實(shí)戰(zhàn)分享的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot fastjson序列化和反序列化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解如何在Java中使用阿里云對(duì)象存儲(chǔ)OSS
Java是世界上最流行的編程語(yǔ)言之一,擁有著廣泛的應(yīng)用場(chǎng)景和強(qiáng)大的生態(tài)系統(tǒng),阿里云對(duì)象存儲(chǔ) OSS 是一種企業(yè)級(jí)的云存儲(chǔ)服務(wù),本文將介紹如何在 Java 中使用阿里云對(duì)象存儲(chǔ) OSS,并寫(xiě)一點(diǎn)相應(yīng)的代碼示例供大家參考2023-06-06使用TraceId在Spring Cloud中實(shí)現(xiàn)線上問(wèn)題快速定位
在微服務(wù)架構(gòu)中,服務(wù)間的互相調(diào)用使得問(wèn)題定位變得復(fù)雜,在此背景下,TraceId為我們提供了一個(gè)在復(fù)雜環(huán)境中追蹤請(qǐng)求路徑和定位問(wèn)題的工具,本文不僅介紹TraceId的基本概念,還將結(jié)合真實(shí)場(chǎng)景,為您展示如何在Spring Cloud中應(yīng)用它2023-09-09SpringBoot項(xiàng)目部署到阿里云服務(wù)器的實(shí)現(xiàn)步驟
本文主要介紹了SpringBoot項(xiàng)目部署到阿里云服務(wù)器的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06SpringCloud OpenFeign 參數(shù)傳遞和響應(yīng)處理的詳細(xì)步驟
本文給大家講解SpringCloud OpenFeign 參數(shù)傳遞和響應(yīng)處理的詳細(xì)步驟,本文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-02-02