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 拥有使用这种结构所需的工具,但我一直在使用网络搜索来脱颖而出。

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 回答
0

您获得的 JSON 结构将匹配这个 java 结构,其中供应商的键是供应商名称。

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

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

您指定的类将支持此 JSON:

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

}

我不认为你可以用杰克逊实现你想要的,因为名称在“供应商”对象之外。

于 2013-10-17T21:40:14.517 回答