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

问题描述 投票:2回答:1

来自XMLAPI响应,我要解析是这样的:

<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);
java xml jackson deserialization xml-deserialization
1个回答
2
投票

您可以将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>
© www.soinside.com 2019 - 2024. All rights reserved.