我有一个看起来像这样的课程:
public class Person {
public class Address {
private String line1;
private String line2;
private String zipCode;
private String state;
// standard public getters and setters for the class here
}
private String name;
private String address;
// standard public getters and setters for the class here
}
这就是我如何使用杰克逊。
public class JsonTest {
public static <T> Object fromJson(String jsonAsString, Class<T> pojoClass)
throws JsonMappingException, JsonParseException, IOException {
return m.readValue(jsonAsString, pojoClass);
}
public static String toJson(Object pojo, boolean prettyPrint)
throws JsonMappingException, JsonGenerationException, IOException {
StringWriter sw = new StringWriter();
JsonGenerator jg = jf.createJsonGenerator(sw);
if (prettyPrint) {
jg.useDefaultPrettyPrinter();
}
m.writeValue(jg, pojo);
return sw.toString();
}
public static void main(String[] args) {
Person p = new Person();
String json = this.toJson(p, true); // converts ‘p’ to JSON just fine
Person personFromJson = this.fromJson(json, Person.class); // throws exception!!!
}
}
main方法的第3行(我尝试将json转换为Person对象),抛出此异常:
IOException: Can not deserialize Class com.mycompany.models.Person$Address (of type non-static member class) as a Bean
我做错了什么?
答案 0 :(得分:8)
因为内部类没有默认的零参数构造函数(它们具有对外部/父类的隐藏引用),杰克逊无法实例化它们。
解决方案是使用static
内部类:
public class Outer {
static class Inner {
private String foo;
public String getFoo() { return foo; }
}
}
原始答案:
在实施过程中存在一些问题,似乎您无法序列化此类,有关详细信息,请参阅cowtowncoder。
答案 1 :(得分:3)
正确,这曾经是目前Jackson版本(1.8及更早版本)无法做到的事情。 但内部阶级绝对有必要是非静态的吗?如果没有,只需在地址声明中添加“静态”,它就可以正常工作;问题在于“隐藏”这个指针,非静态内部类通过构造函数获取。
Jackson 1.9实际上支持对非静态内部类的简单使用进行反序列化,请参阅此Jira entry。