【问题标题】:java jackson XML - how to ignore outer wrappers when parsing?java jackson XML - 解析时如何忽略外包装?
【发布时间】:2019-04-04 17:42:10
【问题描述】:

来自APIXML 响应,我想解析是这样的:

<Envelope>
   <Body>
      <RESULT>
          <SUCCESS>TRUE</SUCCESS>
          <EMAIL>somebody@domain.com</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);

【问题讨论】:

    标签: java xml jackson deserialization xml-deserialization


    【解决方案1】:

    您可以将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 数据格式文档,“树模型仅 以有限的方式支持,建议不要使用它:因为 树模型基于 JSON 信息模型,它不匹配 XML infoset”。这意味着 readTree 方法通常不应该 在解析 XML 时使用。例如,树模型将下降 具有相同名称的重复元素,例如当使用它们来建模时 列表如:

    <items><item><id>1</id></item><item><id>2</id></item></items>
    

    【讨论】:

    • 根据Jackson XML dataformat documentation,“仅以有限的方式支持树模型,建议不要使用它:因为树模型基于 JSON 信息模型,它与 XML 信息集不匹配”。这意味着解析 XML 时通常不应使用 readTree 方法。例如,树模型将删除具有相同名称的重复元素,例如当使用它们来模拟&lt;items&gt;&lt;item&gt;&lt;id&gt;1&lt;/id&gt;&lt;/item&gt;&lt;item&gt;&lt;id&gt;2&lt;/id&gt;&lt;/item&gt;&lt;/items&gt;等列表时。
    • @M.Justin,我同意。此解决方案有局限性,但对于给定的示例,它应该可以正常工作。
    • 只有在 ... more stuff... 部分不包含重复的元素、数组、集合、混合内容或树模型不支持读取 XML 的任何其他内容的情况下才能正常工作。
    • @M.Justin,你是完全正确的。如果我们有非常复杂的XML,我们需要编写一些自定义解串器/适配器,甚至直接使用JAXB,这个解决方案对于简单的XML 有效负载提供了很好的结果。我已将您的评论添加到我的答案中。我希望你没有任何反对意见。在其他情况下,请告诉我。
    • 需要注意的是,这成为工具箱中一个合理的工具,但使用时要格外小心。
    猜你喜欢
    • 2019-01-16
    • 1970-01-01
    • 2011-01-09
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多