1. 程式人生 > >內部類反序列化問題(fastjson exception: create instance error)

內部類反序列化問題(fastjson exception: create instance error)

一、問題

專案開發過程中遇到了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巢狀類與內部類一文分析可知,非靜態成員巢狀類的例項化依賴於外部類例項,而靜態巢狀類的例項化不依賴於外部類,將內部類改為靜態巢狀類即可。