繁体   English   中英

杰克逊嵌套对象反序列化为属性

[英]Jackson Nested Object Deserialization into property

假设我有一个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反序列化为持久化实体,并且希望能够轻松地保持这些实体之间的关系,从而遇到了这个问题。

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

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

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

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

当然,杰克逊不可能从数字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之前有效但污染了你的对象。 无论哪种方式,您都需要编写自定义反序列化程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM