【问题标题】:Jackson 1.8.0 ObjectMapper to serialize/deserialize arbitrary classesJackson 1.8.0 ObjectMapper 序列化/反序列化任意类
【发布时间】:2011-10-13 18:42:39
【问题描述】:

如何告诉 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)

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

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      public class MyType {
          private int a;
      
          @JsonSetter
          public void setA(int a) {...}
      
          public void setA(String a) {...}
      }
      

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

      【讨论】:

      • 这对于 Jackson 来说是一个很好的改进,因为这样做可以将多种 JSON 数据类型(JSON 数字、字符串、对象、数组)映射到 POJO。我认为这个文件也有 RFE。
      猜你喜欢
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多