来自XML
的API
响应,我要解析是这样的:
<Envelope>
<Body>
<RESULT>
<SUCCESS>TRUE</SUCCESS>
<EMAIL>[email protected]</EMAIL>
... more stuff...
</RESULT>
</Body>
</Envelope>
我想把RESULT
的领域变成一个对象。
我可以创建3个类,一个用于包含主体的信封,一个用于包含结果的主体,一个用于结果。但是,有没有捷径?
例如。只需为结果数据创建一个对象,如下所示:
@JacksonXmlRootElement(localName = "Envelope/Body/RESULT")
public class Result {
@JacksonXmlProperty(localName = "SUCCESS")
private boolean success;
@JacksonXmlProperty(localName = "EMAIL")
private String Email;
:
}
我会在这样的行中进行解析:
return theXmlMapper.readValue(resultPayload, Result.class);
您可以将XML
读作树,找到所需的节点并使用treeToValue
方法进行转换。例:
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
JsonNode root = xmlMapper.readTree(xmlFile);
JsonNode node = root.at("/Body/RESULT");
Result result = xmlMapper.treeToValue(node, Result.class);
默认情况下,TRUE
值不会被解析为Boolean
,因此您需要编写自定义反序列化器。
这个解决方案有限制,@M. Justin在他的评论中指出:
根据Jackson XML dataformat文档,“树模型仅以有限的方式支持,建议不要使用它:因为树模型基于JSON信息模型,所以它与XML信息集不匹配”。这意味着在解析XML时通常不应使用readTree方法。例如,树模型将删除具有相同名称的重复元素,例如,使用它们来建模列表,例如:
<items><item><id>1</id></item><item><id>2</id></item></items>