我引用了一个以下列格式返回数组的Web服务:
{
"ZooAnimals": {
"@size": "2",
"Animal": {
"0": {
"@name": "elephant",
"@size": "huge"
},
"1": {
"@name": "termite",
"@size": "verysmall"
}
}
}
}
如果以XML
格式请求,则返回:
<ZooAnimals size="2">
<Animal name="elephant" size="huge"></Animal>
<Animal name="termite" size="very small"></Animal>
</ZooAnimals>
我正在编写一个测试来验证它是否正确地反序列化到Java
类中。 XML
正常工作,但JSON
(使用杰克逊)会出错:无法识别的字段&#34; 0&#34;没有标记为可忽略。
我不控制JSON响应,而是希望使用单个类来接收反序列化的内容。我继承的类是这样注释的:
@XmlAccessorType(XmlAccessType.FIELD)
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
@JsonTypeName("ZooAnimals")
public class ZooAnimals {
@XmlAttribute
@JsonProperty("@size")
private String size;
@XmlElement(name = "Animal", required = false)
@JsonProperty("Animal")
private List<Animal> animalList;
...
}
@XmlAccessorType(XmlAccessType.FIELD)
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
@JsonTypeName("Animal")
public class Animal {
@XmlAttribute
@JsonProperty("@name")
private String name;
@XmlAttribute
@JsonProperty("@size")
private String size;
...
}
有没有办法注释这个类,以便jackson可以反序列化上面的文本而无需编写自定义代码?另外,维持订购不是必需的。
答案 0 :(得分:2)
您必须使用JsonAnySetter
注释,而您的ZooAnimals
类应如下所示:
@XmlAccessorType(XmlAccessType.FIELD)
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
@JsonTypeName("ZooAnimals")
class ZooAnimals {
@XmlAttribute
@JsonProperty("@size")
private String size;
@XmlElement(name = "Animal", required = false)
private List<Animal> animalList;
@JsonAnySetter
public void setAny(String propertyName, Map<String, Animal> map) {
animalList = new ArrayList<Animal>(map.values());
}
// getters, setters, toString
}
您根本不必更改Animal
课程。程序如下:
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
ZooAnimals zooAnimals = mapper.readValue(XML, ZooAnimals.class);
System.out.println(zooAnimals);
打印:
ZooAnimals{size='2', animalList=[Animal{name='elephant', size='huge'}, Animal{name='termite', size='verysmall'}]}