jackson IOException:无法将类com.mycompany.models.Person $ Address(类型为非静态成员类)反序列化为Bean

时间:2011-07-31 16:40:28

标签: java json jackson

我有一个看起来像这样的课程:

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

我做错了什么?

2 个答案:

答案 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