內部類反序列化問題(fastjson exception: create instance error)
阿新 • • 發佈:2018-12-26
一、問題
專案開發過程中遇到了JSON反序列化問題(JSONException: create instance error),問題如下:
...
com.alibaba.fastjson.JSONException: create instance error, class com.test.xiaofan.test.ClassA$ClassB
...
由問題可見,fastjson反序列化時嘗試建立ClassA的內部內ClassB失敗。測試內部類宣告如下:
@Data
public class ClassA {
private String filedA1;
private String fieldA2;
private List<ClassB> fieldA3s;
@Data
public class ClassB {
private String fieldB1;
private String filedB2;
}
}
測試程式碼如下:
public class TestA {
@Test
public void testParseA(){
String str = "{\"fieldA2\":\"test field A2\",\" fieldA3s\":[{\"fieldB1\":\"test field B1\",\"filedB2\":\"test "
+ "field B2\"}],\"filedA1\":\"test field A1\"}\n";
ClassA classA = JSON.parseObject(str, ClassA.class);
System.out.println(JSON.toJSONString(classA));
}
@Test
public void testParseB() {
String str = "{ \"fieldB1\":\"test field B1\",\"filedB2\":\"test field B2\"}";
ClassB classB = JSON.parseObject(str, ClassB.class);
System.out.println(JSON.toJSONString(classB));
}
二、巢狀類與內部類
查看了fastjson官方問題解釋:點選檢視,問題本質為內部類無法例項化,導致fastjson反序列化失敗。
三、解決方案
由Java巢狀類與內部類一文分析可知,非靜態成員巢狀類的例項化依賴於外部類例項,而靜態巢狀類的例項化不依賴於外部類,將內部類改為靜態巢狀類即可。