如何解决Jackson 多态树状结构反序列化
<?xml version="1.0" standalone="yes"?>
<some_element1
some_attribute1="some string"
some_attribute2="some string"
some_attribute3="some string"
>
<some_element2_list>
<some_element2
some_attribute4="some string"
some_attribute5="some string"
/>
</some_element2_list>
<some_element3_list>
<some_element3
some_attribute6="some string"
some_attribute7="some string"
>
<some_element4_list>
<some_element4
some_attribute8="some string"
some_attribute9="some string"
/>
</some_element4_list>
<some_element5_list>
<some_element5
some_attribute10="some string"
some_attribute11="some string"
/>
<some_element5
some_attribute10="some string"
some_attribute11="some string"
/>
</some_element5_list>
</some_element3>
</some_element3_list>
</some_element1>
所以它是一个递归的树状结构,其中:
我可以使用以下命令将其反序列化为 Java 对象:
xmlMapper.readValue(xml,Object.class);
那么:
- 一个元素变成一个
LinkedHashMap
列表或属性 - 一个列表变成一个带有单个
LinkedHashMap
元素的ArrayList
(如果列表中只有一个元素,则直接变成一个带有单个元素的LinkedHashMap
) - 一个属性变成一个
String
是否可以将该结构反序列化为带有注释的自定义 Java 对象?
我尝试了以下类和注释:
@JsonTypeInfo(use = DEDUCTION)
@JsonSubTypes({
@Type(value = ElementList.class),@Type(value = Attribute.class)
})
public interface Field {}
@Value
@AllArgsConstructor(onConstructor_ = {@JsonCreator(mode = DELEGATING)})
public class Attribute implements Field {
@JacksonXmlProperty(isAttribute = true)
String value;
}
@Value
@AllArgsConstructor(onConstructor_ = {@JsonCreator(mode = DELEGATING)})
public class ElementList implements Field {
@JacksonXmlProperty
List<Element> elements;
}
@Value
@AllArgsConstructor(onConstructor_ = {@JsonCreator(mode = DELEGATING)})
public class Element {
Map<String,Field> fields;
}
现在,我收到以下错误:
com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type,class org.example.Field]: Unexpected input
at [Source: (File); line: 2,column: 1] (through reference chain: java.util.LinkedHashMap["some_attribute1"])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。