【问题标题】:Jackson - Start from nested elementJackson - 从嵌套元素开始
【发布时间】:2021-06-16 13:09:49
【问题描述】:

如何从嵌套元素中读取 XML。

例子:

<main>
    <child>
        <child2>
            <child3>
                <user>
                    <name>John</name>
                </user>
                <user>
                    <name>Doe</name>
                </user>
            </child3>
        </child2>
    <child1>
</main>

现在,我需要使用 Jackson 从这个 XML 构造用户对象。基本上我对 child3 元素很感兴趣。我不想创建 main、child1、child2 类。直接我想从child3读取。我怎样才能做到这一点?请帮忙

【问题讨论】:

  • 为什么不将此 XML 解析为 DOM 并取出 child3 并将其传递给其他函数以从 dom 构造对象
  • @sonus21 你能提供一个关于如何取出 child3 的示例 sn-p 吗?

标签: spring-boot jackson deserialization


【解决方案1】:

您可以尝试在下面的 MAP 类中阅读它们,

 XmlMapper xmlMapper = new XmlMapper();
 Map<String,Object> map = xmlMapper.readValue(xml, Map.class);
 Map<String,Object> child1 = (Map<String, Object>) map.get("child1");
 Map<String,Object> child2 = (Map<String, Object>) child1.get("child2");
 Map<String,Object> child3 = (Map<String, Object>) child2.get("child3");

Child3 Map 将只包含数据。 您还需要导入以下 maven 库以使用 XMLMapper

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.11.1</version>
</dependency>

另一种方法是使用 JSONNode,然后最后将其反序列化为 child3 对象。如下图,

XmlMapper xmlMapper = new XmlMapper();
ObjectMapper jsonMapper = new ObjectMapper(); //To convert JSON to object
JsonNode  map = xmlMapper.readValue(xml, JsonNode.class);
JsonNode child1 = map.get("child1");
JsonNode child2 = child1.get("child2");
JsonNode child3 = child2.get("child3");
Child3 child3 = jsonMapper.readValue(child3.toString(),Child3.class);

【讨论】:

  • 但是,这两个将给出 JSON 而不是 XML。因此,xmlMapper.readValue(child3.toString(),Child3.class) 失败并出现错误:Unexpected character '{' (code 123) in prolog; expected '&lt;'
  • 哦对了,你需要使用 ObjectMapper 将 JSON 转换为 Child3 对象。已经修改了上面的答案
  • 收到错误Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token。你能帮忙吗?
  • 看起来 Jackson XML 映射器在处理 XML 中具有相似名称的数组或标签时存在问题。它将前一个替换为最后一个。请看这个帖子stackoverflow.com/questions/39493173/…
  • 该线程中也有关于如何处理 XML 中的重复(多个)元素的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
相关资源
最近更新 更多