内部类反序列化问题
工程中,常常使用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());