gpt4 book ai didi

java - jackson XML 序列化 : list of inherited classes

转载 作者:行者123 更新时间:2023-12-01 20:00:16 29 4
gpt4 key购买 nike

我想序列化/反序列化这样的 XML:

<Multi>
<child-001>
<name/>
<value/>
</child-001>
<child-002>
<name/>
<value/>
</child-002>
</Multi>

其中 child-001 和 child-002 是从同一父级继承的类。

public abstract class Parent {
private String name;
}

@JacksonXmlRootElement(localName = "child-001")
public class Child001 extends Parent {
private String value;
}

@JacksonXmlRootElement(localName = "child-002")
public class Child002 extends Parent {
private String value;
}

封装类如下所示:

class Multi {
@JacksonXmlElementWrapper(useWrapping = false)
private List<Parent> nodes = new ArrayList<>();
}

没有@JacksonXmlElementWrapper(useWrapping = false)我有:

<Multi>
<nodes>
<nodes>
<name>name001</name>
<value>value001</value>
</nodes>
<nodes>
<name>name002</name>
<value>value002</value>
</nodes>
</nodes>
</Multi>

使用我得到的注释:

<Multi>
<nodes>
<name>name001</name>
<value>value001</value>
</nodes>
<nodes>
<name>name002</name>
<value>value002</value>
</nodes>
</Multi>

这与我需要的非常接近,但仍然需要将“nodes”替换为“child-001”和“child-002”。

有人可以指出我在哪里可以找到解决方案吗?或者我应该使用 JAXB 而不是 Jackson?

谢谢

最佳答案

通常,为了表示精确的示例 XML 文件,Multi 类应该如下所示,并且效果很好:

class Multi {
@JacksonXmlProperty(localName = "child-001")
private Child001 child001;

@JacksonXmlProperty(localName = "child-002")
private Child002 child002;
}

在您的代码中,您正在使用父类对象的 List ,大概是因为您可能有任意数量的元素反序列化为 Parent 的子类?这是多态反序列化的情况,需要定义类型信息,例如

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(name = "child-001", value = Child001.class),
@JsonSubTypes.Type(name = "child-002", value = Child002.class)
})
abstract class Parent {
private String name;
}

不幸的是,由于尚未解决(jackson 2.9.2)issue Jackson 期望每个元素都有一个包装器,例如

<Multi>
<nodes>
<child-001>
<name>n1</name>
<value>v1</value>
</child-001>
</nodes>
<nodes>
<child-002>
<name>n2</name>
<value>v2</value>
</child-002>
</nodes>
</Multi>

在此问题解决之前,请考虑是否使用第一个选项。如果您不想序列化某些字段,请将它们保留为空。

关于java - jackson XML 序列化 : list of inherited classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48155494/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com