[英]java/jackson - chained @JsonValue annotations and deserialization
[英]Java - Deserialization Annotations with fasterXML and Jackson
這是一個工作代碼的簡單示例,該代碼使用構造函數中的fastXML / Jackson反序列化字符串列表:
private List<String> xyz;
@JsonCreator
public FooBar(@JsonProperty("blargs") List<String> xyz)
{
this.xyz = xyz
}
因此,上面的代碼工作正常,並且是我對如何使用Jackson來反序列化json字符串的理解,例如: {"blargs":["one","two","three"]}
所以,這是我的問題:
我的輸入json現在看起來像這樣:
{"blargs":[
{"fooId":888,"barVal":"tacos"},
{"fooId":222,"barVal":"hamburgers"},
{"fooId":444,"barVal":"underpants"}
]
}
...但是我不知道如何注釋構造函數以將傳入的json反序列化到我的地圖中,其中fooId和barVal成為鍵/值對。
到目前為止,這是我的工作
private Map<Integer, String> xyz;
@JsonCreator
public FooBar(@JsonProperty("blargs") ????? Map<Integer, String> xyz)
{
this.xyz = xyz
}
注意:我這樣調用上面顯示的構造函數:
ObjectMapper mapper = new ObjectMapper();
FooBar fooBar = mapper.readValue(jsonValue, FooBar.class);
您需要一個數據類
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.List;
public class JsonApp {
public static void main(String[] args) throws IOException {
String json = "{\"blargs\":[\n"
+ " {\"fooId\":888,\"barVal\":\"tacos\"},\n"
+ " {\"fooId\":222,\"barVal\":\"hamburgers\"},\n"
+ " {\"fooId\":444,\"barVal\":\"underpants\"}\n"
+ " ]\n"
+ "}";
ObjectMapper mapper = new ObjectMapper();
FooBar fooBar = mapper.readValue(json, FooBar.class);
}
public static class FooBar {
private List<MyObject> xyz;
@JsonCreator
public FooBar(@JsonProperty("blargs") List<MyObject> xyz) {
this.xyz = xyz;
System.out.println(this.xyz);
}
}
public static class MyObject {
private int fooId;
private String barVal;
public int getFooId() {
return fooId;
}
public void setFooId(int fooId) {
this.fooId = fooId;
}
public String getBarVal() {
return barVal;
}
public void setBarVal(String barVal) {
this.barVal = barVal;
}
@Override
public String toString() {
return "MyObject{" + "fooId=" + fooId + ", barVal=" + barVal + '}';
}
}
}
您可以編寫自定義解串器:
public static class XyzDeserializer extends JsonDeserializer<Map<Integer, String>> {
@Override
public Map<Integer, String> deserialize(JsonParser p,
DeserializationContext ctxt) throws IOException {
JsonNode rootNode = p.getCodec().readTree(p);
Map<Integer, String> map = new HashMap<>();
rootNode.forEach(n -> map.put(
n.get("fooId").intValue(),
n.get("barVal").asText()
));
return map;
}
}
並以這種方式使用它:
@JsonCreator
public FooBar(
@JsonProperty("blargs")
@JsonDeserialize(using = XyzDeserializer.class) Map<Integer, String> xyz) {
this.xyz = xyz;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.