我的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对象。
我确信杰克逊拥有使用这种结构所需的工具,但我一直在寻找网络搜索。
答案 0 :(得分: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]]]
答案 1 :(得分: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对象匹配的那个更清楚。
答案 2 :(得分: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"
},
...]
}
我认为你不能用杰克逊实现你想要的东西,因为名字在“供应商”对象之外。