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);
}
}
答案 0 :(得分:8)
看起来非静态内部类的识别是直接在它们的包含bean上的属性完成的(2.6.3中的BeanDeserializerBase.java
第476行)。因此,干预的集合解串器将超越它。自定义反序列化器可能是最简单的选项。
请注意,您仍然可以使用Jackson来阅读Nested
的属性,并且只需在反序列化{{列表'时使用的自定义反序列化 中自行构建它。 1}}对象。
要执行此操作,请按以下方式注释列表:
Nested
然后使用自定义反序列化器:
调用查找包含 @JsonDeserialize(contentUsing = NestedDeserializer.class)
public List<Nested> nestedList;
实例的解析上下文。
封装MyClass
的默认/根级反序列化程序,以将反序列化内容的工作委托给。
例如:
Nested