[英]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.