簡體   English   中英

使用 Jackson 將列表和對象反序列化為相同的結構

[英]Deserialize Lists and Objects to the same Structure with Jackson

作為我的應用程序的輸入,我可能會得到一個 JsonObject 或它們的列表:

input1 = [ { "prop": "val1" }, { "prop": "val2" } ]
input2 = { "prop": "val" }

我可以使用JsonNode作為兩個輸入的目標類型

objectMapper.readValue(input1, JsonNode.class);
objectMapper.readValue(input2, JsonNode.class);

然后評估根節點是ArrayNode還是ObjectNode

我尋求一種方法來定義我的自定義目標類型,例如List<MyObject>如果提供了 JsonObject,則它具有一個 Element,如果提供了 List,則它具有零到多個。

objectMapper.readValue(input, new TypeRef<ArrayList<MyObject>>() {});

但是對於單個對象失敗 - 它不能從 {.

我試圖創建自己的類型:

public class MyList extends ArrayList<MyObject> {
    public String prop;

    @JsonCreator
    public MyList(String prop) {
        super();
        this.prop = prop; // Resp add(new MyObject(prop));
    }

    public MyList() {}
}

但是 Jackson 拒絕將 JsonCreator 用於單個對象。

有什么辦法,我可以做到這一點(理想情況下沒有自定義序列化程序,除非它可以變得非常通用)

當然,傑克遜對此有一個簡單的解決方案:
DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY對您的幫助!

@EqualsAndHashCode
public class Example {
    @JsonProperty public String name
}

@Test
public void experiment() {
    ObjectMapper om = new ObjectMapper();
    om.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

    String list= "[{ \"name\": \"peter\" }]";
    String single= "{ \"name\": \"peter\" }";

    List<Example> respList = om.readValue(list, new TypeReference<List<Example>>() {});
    List<Example> respSingle = om.readValue(single, new TypeReference<List<Example>>() {}); 
    Assert.assertEquals(respList, respSingle)
}

暫無
暫無

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

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