Json Jackson与JAXB-抽象类型实例化
我面临Jackson的ObjectMapper使用JAXB注释的问题。具体地说,我正在收集接口通用信息,尽管我可以从XML反序列化输入,但使用Jackson(使用JAXB内省器)是不可能的。也许我只是缺少一些配置属性或JAXB注释?问题是“抽象类型只能用额外的类型信息进行实例化”,我认为带有类型信息的@xmlementref(或@xmlement)可以处理这个问题,但显然它不能 请注意,如果可能的话,我只想使用JAXB注释。 例如,使用@JsonTypeInfo或@JsonDeserialize将是最后一件事 java:Json Jackson与JAXB-抽象类型实例化,json,jaxb,jackson,Json,Jaxb,Jackson,我面临Jackson的ObjectMapper使用JAXB注释的问题。具体地说,我正在收集接口通用信息,尽管我可以从XML反序列化输入,但使用Jackson(使用JAXB内省器)是不可能的。也许我只是缺少一些配置属性或JAXB注释?问题是“抽象类型只能用额外的类型信息进行实例化”,我认为带有类型信息的@xmlementref(或@xmlement)可以处理这个问题,但显然它不能 请注意,如果可能的话,我只想使用JAXB注释。 例如,使用@JsonTypeInfo或@JsonDeserialize
@XmlSeeAlso(Entry.class)
public interface IEntry {
String getValue();
}
@XmlRootElement(name = "entry")
public class Entry implements IEntry {
@XmlElement(name = "value")
String value;
public Entry() {
}
public Entry(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
Entry.java:
@XmlSeeAlso(Entry.class)
public interface IEntry {
String getValue();
}
@XmlRootElement(name = "entry")
public class Entry implements IEntry {
@XmlElement(name = "value")
String value;
public Entry() {
}
public Entry(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
Aggregator.java:
@XmlRootElement(name = "aggregator")
public class Aggregator {
@XmlElementRef(type = Entry.class)
private Set<IEntry> entries;
public Aggregator() {
}
public Aggregator(Set<IEntry> entries) {
this.entries = entries;
}
public Set<IEntry> getEntries() {
return entries;
}
}
感谢您的回复。注意:我是专家组的负责人和成员
import org.codehaus.jackson.map.annotate.JsonDeserialize;
@JsonDeserialize(as = Entry.class)
public interface IEntry {
String getValue();
}
我不确定Jackson是否支持此用例,但您似乎使用了不正确的@xmlementref
。使用@xmlementref
时,与类关联的根元素名称用于确定要实例化的实例。如果示例中的节点条目
与@XmlRootElement(name=“entry”)
注释不匹配
您可以尝试以下选项之一(它们都适用于MOXy的JSON绑定,请参阅:):
选项1-在条目上更改@XMLRootElement
@XmlRootElement(name = "entries")
public class Entry implements IEntry {
@XmlElement(name = "value")
String value;
public Entry() {
}
public Entry(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
选项#2-更改JSON文档
{"entry":[{"value":"X"},{"value":"Y"},{"value":"Z"}]}}
选项#3-使用@xmlement
而不是@xmlementref
如果使用@XmlElement
注释,则可以在字段/属性上指定节点名称,而不是依赖@XmlRootElement
注释。此外,如果对字段进行注释,则应在类型级别指定@xmlacessortype(xmlacesstype.FIELD)
import java.util.Set;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "aggregator")
@XmlAccessorType(XmlAccessType.FIELD)
public class Aggregator {
@XmlElement(type = Entry.class)
private Set<IEntry> entries;
public Aggregator() {
}
public Aggregator(Set<IEntry> entries) {
this.entries = entries;
}
public Set<IEntry> getEntries() {
return entries;
}
}
import java.util.Set;
导入javax.xml.bind.annotation.*;
@XmlRootElement(name=“聚合器”)
@XmlAccessorType(XmlAccessType.FIELD)
公共类聚合器{
@XmlElement(类型=Entry.class)
私有集合条目;
公共聚合器(){
}
公共聚合器(集合项){
this.entries=条目;
}
公共集合getEntries(){
返回条目;
}
}
了解更多信息