Jackson JSON在嵌套类的集合上给出了异常

时间:2015-11-14 09:38:17

标签: java json serialization jackson

Jackson JSON序列化/反序列化此类没有问题:

public class MyClass {
   public class Nested {
      public String string;
      public Nested() {}
   }
   public Nested nestedVar;
}

但在这一个:

public class MyClass {
   class Nested {
      public String string;
      public Nested() {}
   }
   public Nested nestedVar;
   public List<Nested> nestedList;
}

反序列化时出现此异常:

  

com.fasterxml.jackson.databind.JsonMappingException:没有为类型[simple type,class test.MyClass $ Nested]找到合适的构造函数:无法从JSON对象实例化(缺少默认构造函数或创建者,或者可能需要添加/启用类型信息?)    在[来源:java.io.StringReader@26653222; line:1,column:48](通过引用链:test.MyClass [&#34; nestedList&#34;] - &gt; java.util.ArrayList [0])

在第一种情况下,Jackson处理嵌套类的实例没有问题,但在第二种情况下没有问题。

我必须编写自定义反序列化程序吗?

测试代码(Jackson 2.6.3):

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

public class ATest {

   public static void main(String[] args) throws IOException {

      ObjectMapper mapper = new ObjectMapper();

      StringWriter sw = new StringWriter();

      MyClass myClass = new MyClass();

      MyClass.Nested nestedVar = myClass.new Nested();

      List<MyClass.Nested> nestedList = new ArrayList<>();

      nestedList.add(nestedVar);

      myClass.nestedList =nestedList;

      myClass.nestedVar = nestedVar;

      mapper.writeValue(sw, myClass);

      System.out.println(sw.toString());

      StringReader sr = new StringReader(sw.toString());

      MyClass z = mapper.readValue(sr, MyClass.class);
}

}

1 个答案:

答案 0 :(得分:8)

看起来非静态内部类的识别是直接在它们的包含bean上的属性完成的(2.6.3中的BeanDeserializerBase.java第476行)。因此,干预的集合解串器将超越它。自定义反序列化器可能是最简单的选项。

请注意,您仍然可以使用Jackson来阅读Nested的属性,并且只需在反序列化{{列表'时使用的自定义反序列化 中自行构建它。 1}}对象。

要执行此操作,请按以下方式注释列表:

Nested

然后使用自定义反序列化器:

  1. 调用查找包含 @JsonDeserialize(contentUsing = NestedDeserializer.class) public List<Nested> nestedList; 实例的解析上下文。

  2. 封装MyClass的默认/根级反序列化程序,以将反序列化内容的工作委托给。

  3. 例如:

    Nested