簡體   English   中英

Java-使用fastXML和Jackson進行反序列化注釋

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

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