使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

麦可

我正在尝试反序列化以下XML:

<root>
    <foo name="AAA" />
    <bar name="BBB" />
    <foo name="CCC" />
</root>

我的杰克逊课程是:

@Data
public class Foo {
    @JacksonXmlProperty(isAttribute = true)
    private String name;
}

酒吧是相同的,只是一个不同的类名。(在实际代码中,它们是不同的,这只是一个示例)。

根类是

@Data
public class Root {
    @JacksonXmlProperty(localName = "foo")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Foo> foos;
    @JacksonXmlProperty(localName = "bar")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Bar> bars;
}

当我尝试反序列化XML时,使用此代码

System.out.println(new XmlMapper().readValue(theXml, Root.class));

结果是这样(注意缺少“ AAA”):

Root(foos=[Foo(name=CCC)], bars=[Bar(name=BBB)])

但是,如果我移动XML中的字段,使两个foo标签彼此相邻,则会打印

Root(foos=[Foo(name=AAA), Foo(name=CCC)], bars=[Bar(name=BBB)])

我正在使用最新的jackson-dataformat-xml 2.11.1。

这是怎么回事,我该如何解决?

诺曼

对于任何属性,您都可以使用Jackson注释(JsonSetterJsonGetter指定一种用作设置器或获取器的方法当您只需要对Jackson的操作进行一些修改时,那么为整个类编写自定义deserializer/ 似乎更容易serializer杰克逊还有一个JsonAnySetter批注,该批注用于在类中未指定的内容(我发现有时很方便;我已使用它将一种元素类型的所有XML属性放入单个Map中,而不是而不是必须为每个可能的属性都具有属性)。

您可以在Root类中添加自定义XML反序列化方法。像这样:

@JsonSetter(value =  "foo")
public void setFooFromXml(Foo foo) {
    if (this.foos == null) {
        this.foos = new ArrayList<Foo>();
    } 
    this.foos.add(foo);
}

@JsonSetter(value =  "bar")
public void setBarFromXml(Bar bar) {
    if (this.bars == null) {
        this.bars = new ArrayList<Bar>();
    } 
    this.bars.add(bar);
}

使用Jackson来反序列化XML,如下所示:

try {
    String input = "<root><foo name=\"AAA\" /><bar name=\"BBB\" /><foo name=\"CCC\" /></root>";
    XmlMapper mapper = new XmlMapper();
    Root root = mapper.readValue(input, Root.class);
    System.out.println(root.getBars());
    System.out.println(root.getFoos());
    
} catch (Exception e) {
    e.printStackTrace();
}

给出此输出(在添加一些简单的toString()和getter方法之后):

[Bar [name=BBB]]
[Foo [name=AAA], Foo [name=CCC]]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

来自分类常见问题

使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

Related 相关文章

  1. 1

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  2. 2

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  3. 3

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  4. 4

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  5. 5

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  6. 6

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  7. 7

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  8. 8

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  9. 9

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  10. 10

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  11. 11

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  12. 12

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  13. 13

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  14. 14

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  15. 15

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  16. 16

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  17. 17

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  18. 18

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  19. 19

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  20. 20

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  21. 21

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  22. 22

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  23. 23

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  24. 24

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  25. 25

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  26. 26

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  27. 27

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  28. 28

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

  29. 29

    使用多个useWrapping = false时,Jackson XML反序列化将跳过字段

热门标签

归档