簡體   English   中英

如何用Jackson編寫展平List序列化器?

[英]How to write flattening List deserializer with Jackson?

我正在嘗試使用Jackson將特定結構的JSON反序列化為Java類。 我有幾個像這樣的課程:

class A {
  private int number1;
  private List<X> list1;
  private int number2;
}

class X {
  private String field1;
  private double value1;
}


class B {
  private String name2;
  private List<Y> list2;
}

class Y {
  private String field2;
}

我從外部系統獲取JSON,如下所示:

{
  "number1": 1,
  "list1": {
    "elements": [{
      "field1": "Field 1 value 1",
      "value1": 2.2
    }, {
      "field1": "Field 1 value 2"
    }]
  },
  "number2": 2,
}


{
  "name2": "Name 2",
  "list2": {
    "elements": [{
      "field2": "Field 2 value 1"
    }]
  }
}

我只想編寫一個自定義反序列化器,可以以一種通用的方式擺脫這個元素級別(我的意思是為所有類都擁有一個反序列化器)。 有沒有簡單的方法來擴展StdDeserializer來完成該任務,或者我必須使用自定義算法編寫一個全新的反序列化器?

您可以看一下這個問題: Jackson-將內部對象列表反序列化為非常相似的更高級別的列表 我已經實現了自定義反序列化器,該反序列化器可用於帶有內部列表的許多不同類型。 您的示例POJO可能如下所示:

class A {
    private int number1;

    @JsonDeserialize(using = InnerListDeserializer.class)
    private List<X> list1;
    private int number2;

    // getters, setters
}

編輯
如果您不想使用任何注釋或自定義反序列化,則需要創建適合給定JSON POJO結構。 您需要創建中間POJO

class ListWrapper<T> {

    private List<T> elements;

    // getter, setter, toString, etc
}

現在,您需要以這種方式更新類AB

class A {
    private int number1;
    private ListWrapper<X> list1;
    private int number2;

    // getters, setters, toString
}

class B {

    private String name2;
    private ListWrapper<Y> list2;

    // getters, setters, toString
}

暫無
暫無

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

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