1. 程式人生 > >fastjson反序列化巢狀類為對應實體類 ResultObject的反序列化及泛型優化

fastjson反序列化巢狀類為對應實體類 ResultObject的反序列化及泛型優化

內部類反序列化問題

工程中,常常使用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());

反序列化成功後