0

次のようなjsonがあります。

{
    "summary":{
        "somefield1":"somevalue1",
        "Twilio":{
            "field1":"value1",
            "field2":"value2"
        },
        "Tropo":{
            "field1":"value1",
            "field2":"value2"
        },
        ...
    }
}

次のようなJavaクラスにデシリアライズしたいと思います。

public class Summary {
    private String someField1;
    private List<Vendor> vendors;
}

public class Vendor {
    private String name;
    private String field1;
    private String field2;
}

したがって、Twilio と Tropo は、Vendor.name == "Twilio" または "Tropo" のリストで Vendor オブジェクトになる必要があります。

jackson には、この構造を処理するために必要なツールがあると確信していますが、Web 検索を試してみました。

4

3 に答える 3

2

@JsonRootName@JsonAnySetter注釈の組み合わせでそれを行うことができます。クラスSummaryは次のようになります。

@JsonRootName("summary")
class Summary {

    @JsonProperty("somefield1")
    private String someField1;
    private List<Vendor> vendors = new ArrayList<Vendor>();

    @JsonAnySetter
    public void setDynamicProperty(String vendorName, Map<String, String> properties) {
        Vendor vendor = new Vendor();
        vendor.setName(vendorName);
        vendor.setField1(properties.get("field1"));
        vendor.setField2(properties.get("field2"));

        vendors.add(vendor);
    }

    //getters,setters,toString methods

}

使用例:

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);

System.out.println(mapper.readValue(json, Summary.class));

上記のソース コードは、JSON の以下の文字列を示しています。

Summary [someField1=somevalue1, vendors=[Vendor [name=Twilio, field1=value1, field2=value2], Vendor [name=Tropo, field1=value1, field2=value2]]]
于 2013-10-18T00:11:11.123 に答える
1

オブジェクトを使用する場合:

public class Summary {
    private String someField1;
    private List<Vendor> vendors;
}

public class Vendor {
    private String name;
    private String field1;
    private String field2;
}

jsonを変更する必要があります。実際には、定義したような構造は次のように変換されます。

{
"summary": {
    "somefield1": "somevalue1",
    "vendors": [
        {
            "name": "Twilio",
            "field1": "value1",
            "field2": "value2"
        },
        {
            "name": "Tropo",
            "field1": "value1",
            "field2": "value2"
        }
    ]
}

}

リストは角括弧の間に定義され、[]あなたの場合はオブジェクトのリストです{}

投稿する構造は扱いにくいため、可能であればjsonを変更します。あなたのJavaオブジェクトと一致する、私が指摘したものはより明確です。

于 2013-10-17T22:19:20.047 に答える