Jackson 1.8.0 ObjectMapper用于序列化/反序列化任意类

时间:2011-07-26 21:09:12

标签: json spring java-ee spring-mvc jackson

如何告诉Jacksons ObjectMapper序列化我自己的类?我必须提供序列化器吗?

考虑以下示例:

public class MyType {
    private int a;
    private String b;
    // Getters and Setters
}

// TODO: configure ObjectMapper, such that the following is true:

objectMapper.canDeserialize(type)

我相信杰克逊有一种方法可以自动完成所有操作,而无需指定反序列化“策略”,因为MyType的序列化已经有效。

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

是的,它可以在没有自定义序列化程序的情况下序列化POJO。 但在您的情况下,问题是所有属性都是“隐藏”的。默认情况下,杰克逊会寻找:

  • 公共字段和getter(getXxx())
  • 任何可见性的Setters(setXxx())

要使Jackson使用私有字段,您可以使用@JsonProperty对其进行注释,或者更改默认的可见性检查级别,如果您希望找到所有私有(或受保护的包可见)字段。 这可以通过注释(@JsonAutoDetect)或定义全局可见性检查器来完成。

答案 1 :(得分:2)

我的自定义类出了问题,因为它有一些不明确的setter方法。如果您使用@JsonSetter注释要用作setter的方法的onoe,一切都是正确的。

public class MyType {
    private int a;

    @JsonSetter
    public void setA(int a) {...}

    public void setA(String a) {...}
}

如果没有注释,objectMapper.deserialize(...)将失败。在内部抛出了一个提供更多信息的exeption,但它被捕获并且只返回false。