Joh*_*tle 2 java xml jackson xml-deserialization deserialization
XML我想解析的响应是API这样的:
<Envelope>
<Body>
<RESULT>
<SUCCESS>TRUE</SUCCESS>
<EMAIL>somebody@domain.com</EMAIL>
... more stuff...
</RESULT>
</Body>
</Envelope>
Run Code Online (Sandbox Code Playgroud)
我想将 的字段RESULT放入一个对象中。
我可以创建 3 个类,一个用于包含正文的信封,一个用于包含结果的正文,一个用于结果。但是,有捷径吗?
例如,只需为结果数据创建一个对象,如下所示:
@JacksonXmlRootElement(localName = "Envelope/Body/RESULT")
public class Result {
@JacksonXmlProperty(localName = "SUCCESS")
private boolean success;
@JacksonXmlProperty(localName = "EMAIL")
private String Email;
:
}
Run Code Online (Sandbox Code Playgroud)
我会在这样的行中进行解析:
return theXmlMapper.readValue(resultPayload, Result.class);
Run Code Online (Sandbox Code Playgroud)
您可以读取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);
Run Code Online (Sandbox Code Playgroud)
TRUE默认情况下不会解析值,Boolean因此您需要编写自定义反序列化器。
该解决方案有局限性,@M. 贾斯汀在评论中指出:
根据 Jackson XML 数据格式文档,“树模型仅以有限的方式支持,建议不要使用它:由于树模型基于 JSON 信息模型,因此它与 XML 信息集不匹配”。这意味着在解析 XML 时通常不应使用 readTree 方法。例如,树模型将删除具有相同名称的重复元素,例如,当使用它们来建模列表时,例如:
<items><item><id>1</id></item><item><id>2</id></item></items>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2170 次 |
| 最近记录: |