簡體   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