java jackson XML - 解析时如何忽略外部包装?

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)

Mic*_*ber 5

您可以读取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)