簡體   English   中英

使用Jackson反序列化包含在具有未知屬性名稱的對象中的JSON

[英]Deserialize a JSON wrapped in an object with an unknown property name using Jackson

我正在使用Jackson將JSON從ReST API反序列化為使用Jackson的Java對象。

我遇到的問題是,一個特定的ReST響應包含在由數字標識符引用的對象中,如下所示:

{
  "1443": [
    /* these are the objects I actually care about */
    {
      "name": "V1",
      "count": 1999,
      "distinctCount": 1999
      /* other properties */
    },
    {
      "name": "V2",
      "count": 1999,
      "distinctCount": 42
      /* other properties */
    },
    ...
  ]
}

我的(可能是天真的)將JSON反序列化的方法一直是創建鏡像POJO並讓Jackson簡單地自動映射所有字段,這很好。

問題是ReST響應JSON對我實際需要的POJO數組有一個動態的數字引用。 我無法創建鏡像包裝器POJO,因為屬性名稱本身既是動態的又是非法的Java屬性名稱。

我很感激我可以調查的路線的任何和所有建議。

沒有自定義反序列化器的最簡單的解決方案是使用@JsonAnySetter Jackson將為每個未映射的屬性調用帶有此注釋的方法。

例如:

public class Wrapper {
  public List<Stuff> stuff;

  // this will get called for every key in the root object
  @JsonAnySetter
  public void set(String code, List<Stuff> stuff) {
    // code is "1443", stuff is the list with stuff
    this.stuff = stuff;
  }
}

// simple stuff class with everything public for demonstration only
public class Stuff {
  public String name;
  public int count;
  public int distinctCount;
}

要使用它,你可以這樣做:

new ObjectMapper().readValue(myJson, Wrapper.class);

@JsonAnyGetter ,你可以使用@JsonAnyGetter ,在這種情況下應該返回Map<String, List<Stuff>)

我認為最簡單的解決方案是使用自定義JsonDeserializer。 它允許您逐步解析輸入並僅提取構建對象所需的信息。

下面是一個如何實現自定義反序列化器的簡單示例: 自定義jackson反序列化器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM