fastjson反序列化巢狀類為對應實體類 ResultObject的反序列化及泛型優化
阿新 • • 發佈:2018-12-26
內部類反序列化問題
工程中,常常使用ResultObject類或者Msg類作為通用返回型別
@Data
public class Msg {
private String type;
//data欄位,Object型別,通常需要轉換為對應實體類
private Object data;
}
其中data欄位型別為Object類,但是工程中往往需要將其序列化成對應的實體類
最近遇見這個問題比較頭痛,沒法直接型別強轉為對應實體類,於是打了個斷點測試了下
我們發現:
對於Object型別內部類,fastJson(jackson也類似)會將其轉換為JSONObject
類,其中每個欄位是HashMap的鍵值對
內部類反序列化
因此,我們有兩種思路:
序列化為JSON串,再反序列化
將JsonObject轉換為JsonString,並使用parseObject將其反序列化,其中序列化為JSON串有兩種辦法,
JSON.toJSONString(Object javaObject)
jsonObject.toJSONString()
分別如下所示
//序列化為JSON串 Object object =reqMsg.getData(); String strJSON= JSON.toJSONString(object); //再反序列化 UserMeeting userMeeting = JSON.parseObject(strJSON, UserMeeting.class)
//強轉為JSONObject
JSONObject jsonObject = (JSONObject) reqMsg.getData();
//先序列化為JSONString,再反序列化
UserMeeting userMeeting = JSON.parseObject(jsonObject.toJSONString(), UserMeeting.class);
使用泛型(推薦)
在fastJson反序列化時,指定內部的泛型T為對應的TestInner實體類,拓展性很好
@Data public class TestResult<T> { private String type; private T data; }
//使用TypeReference指定TestResult對應的內部泛型TestInner
TestResult testResult =JSON.parseObject(jsonStr,new TypeReference<TestResult<TestInner>>(){});
System.out.println(((TestInner) testResult.getData()).getName());