【发布时间】:2016-02-15 21:03:45
【问题描述】:
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:没有找到适合类型[简单类型,类 test.MyClass$Nested] 的构造函数:无法从 JSON 对象实例化(缺少默认构造函数或创建者,或者可能需要添加/启用类型信息?) 在 [来源:java.io.StringReader@26653222; line: 1, column: 48](通过引用链:test.MyClass["nestedList"]->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);
}
}
【问题讨论】:
-
尝试创建一个 list 对象或至少 set public List
nestedList = null; -
尝试将内部类设为静态。
-
nestedList = null 不起作用
-
添加了有问题的测试代码
-
感谢测试代码。关于嵌套类的
static:它将避免您在此处遇到的问题,并且参数“我不想使内部类在外部类之外可访问” 不受@987654325 的影响@。目前Nested在您的示例中是包私有的,您可以保持这种方式。
标签: java json serialization jackson