【问题标题】:Jackson Nested Object Deserialization into propertyJackson 将嵌套对象反序列化为属性
【发布时间】:2011-12-21 13:44:32
【问题描述】:

假设我有一个看起来像这样的 json 对象:

  {
    id: 1,
    name: "john doe"
    spouse: 2
  }

以及我希望它反序列化的类:

class Person{

  private Long id;
  private String name;

  private Person spouse;

  //getters/setters
}

有没有办法告诉杰克逊在反序列化 JSON 时将spouse: 2 属性扩展为带有id=2 的新Person POJO?

由于将 JSON 反序列化为持久实体,我遇到了这个问题,并且希望能够轻松地保留这些实体之间的关系。

【问题讨论】:

    标签: java json hibernate jackson


    【解决方案1】:

    除了完整的反序列化器之外,还有一种更简单的方法:使用单个 int-arg 构造函数定义 POJO,如下所示:

    class Person {
       int id;
       public Person(int id) {
         this.id = id;
       }
    }
    

    这确实有效,因为 Jackson 会尝试找到数量有限的特殊构造函数(采用 String、int、long、double 或 boolean 的单参数公共构造函数)。

    您也可以选择使用@JsonCreator 来表示这些——如果构造函数不是公共的,您必须这样做,以使其可被发现。但对于公共 ctor 而言,这不是必需的。

    【讨论】:

    • 这是我最终选择的选项。它简单直观。它不能很好地与持久层挂钩,但这是另一个问题。
    【解决方案2】:

    杰克逊当然不可能从数字2 中推断出代表配偶的完全填充的Person 对象。您可能需要注册一个自定义反序列化器来检查输入是否为整数,如果是,则从存储它的任何位置查找配偶。对于包含对自身的引用的类,我没有做过这种事情(例如,您的 Person 包含 Person),所以我只能给您粗略的指导。

    我相信这可能仅适用于 Jackson 版本 1.9 或更高版本。基本上,您可以使用对象映射器注册一个模块,告诉 Jackson 使用自定义反序列化器。

    SimpleModule module = new SimpleModule("PeopleModule", new Version(1, 1, 0, null);
    module.addDeserializer(Person.class, new JacksonPersonDeserializer());
    
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(module);
    

    或者在 Person 类本身上,您可以执行以下操作:

    class Person {
    
      @JsonDeserialize(using=JacksonPersonDeserializer.class)
      Person spouse;
    }
    

    这在1.9 之前有效,但会污染您的对象。无论哪种方式,您都需要编写一个自定义反序列化器。

    【讨论】:

    • 我想我需要对注释和自定义反序列化器做一些事情。我不知道 @JsonDeserialize 注释在字段上是有效的,所以我会沿着这条路走。
    • 嗯。它实际上可能只适用于二传手。不过值得在球场上尝试。
    • 一般来说,这是真的——杰克逊不能进行结构转换。但是 int/double/String 的情况比较特殊,看我的回答。
    • 在@JsonDeserialize -- 是的,适用于字段、设置器;但在 1.9 之前必须使用一个。 1.9 结合了注释,所以即使你有 setter 和 getter(以前必须在 setter 上)也应该可以工作。
    • 我正在尝试编写一个 Jackson 模块,其目的是无缝地提供一些特定的功能。我不想像在接受的答案中那样创建一个特殊的构造函数,因为我不想接触 POJO。我如何使用自定义反序列化器路由来实现这一点?请检查我的问题:stackoverflow.com/questions/19008853/… 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多