使用FastJSON實現多態支持(又快又強)

FastJson 可謂是史上最快的JSON解析庫!

但這不是本文的重點。

主要想說下基於FastJson的一種通用泛型解析的方案,也就是對於多態的支持。


使用FastJSON實現多態支持(又快又強)

又快又強


簡單地說,就是我們使用FastJson,調用JSON.parseObject(jsonstr, XXX.class)方法的時候,如果XXX是一個抽象類,或者接口,這時候會得到的結果是null,也就說我們是沒有辦法只指定一個抽象類(或者接口),它就能直接根據json字符串中提供的實現類信息,幫我們解析成相應的實現類的。

那麼如何實現它對多態的支持呢?

FastJson給我們提供了一種方式:

當我們將具體實現類解析為JSON字符串時,我們可以為其指定SerializerFeature

通過添加SerializerFeature.WriteClassName,將在生成的json字符串中,添加序列化信息。

代碼如下:

假設有個抽象類A:

abstract class A;

實現類B 和 C:

class B extends A;

class C extends A;

當我們將B或者C解析為JSON時,我們添加SerializerFeature:

<code>B b = new B();
JSONObject.toJSONString(b, SerializerFeature.WriteClassName);/<code>

此時解析成功的JSON內容如下:

{
"@type":"com.json.test.dto.B",
"test":"1392"
}

將攜帶一個@type的屬性,指定了序列化的類。


之後我們便可以直接使用抽象類A,通過反序列化解析字符串,得到具體的實現類了。

<code>JSONObject.parseObject(str, A.class);   // 根據@type,得到結果是 b/<code>



要注意的是,FastJSON在1.2.25之後的版本,增加了autotype功能的限制,該版本及該版本後的JSON解析,在進行多態轉換的時候,會報出異常

autotype is not support

該安全升級包禁用了部分autotype的功能,也就是"@type"這種指定類型的功能會被限制在一定範圍內使用。

此時我們需要通過配置來開啟autoType,FastJSON的官方wiki提供瞭解決方案。

建議使用以下解決方案:

通過類路徑的fastjson.properties文件來配置,配置方式如下:

<code>fastjson.parser.autoTypeAccept=com.taobao.pac.client.sdk.dataobject.,com.cainiao. // 如果有多個包名前綴,用逗號隔開/<code>

注意包路徑結尾的 .


分享到:


相關文章: