Json Jackson与JAXB-抽象类型实例化

Json Jackson与JAXB-抽象类型实例化,json,jaxb,jackson,Json,Jaxb,Jackson,我面临Jackson的ObjectMapper使用JAXB注释的问题。具体地说,我正在收集接口通用信息,尽管我可以从XML反序列化输入,但使用Jackson(使用JAXB内省器)是不可能的。也许我只是缺少一些配置属性或JAXB注释?问题是“抽象类型只能用额外的类型信息进行实例化”,我认为带有类型信息的@xmlementref(或@xmlement)可以处理这个问题,但显然它不能 请注意,如果可能的话,我只想使用JAXB注释。 例如,使用@JsonTypeInfo或@JsonDeserialize

我面临Jackson的ObjectMapper使用JAXB注释的问题。具体地说,我正在收集接口通用信息,尽管我可以从XML反序列化输入,但使用Jackson(使用JAXB内省器)是不可能的。也许我只是缺少一些配置属性或JAXB注释?问题是“抽象类型只能用额外的类型信息进行实例化”,我认为带有类型信息的@xmlementref(或@xmlement)可以处理这个问题,但显然它不能

请注意,如果可能的话,我只想使用JAXB注释。 例如,使用@JsonTypeInfo或@JsonDeserialize将是最后一件事

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;
    }
}
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(){
返回条目;
}
}
了解更多信息


谢谢,我知道这一点,但我注意到,如果可能的话,我更喜欢只使用JAXB注释:-)只使用JAXB注释这是不可能的好吧,我会等待一段时间,如果没有其他人回答,我会将您的答案标记为正确。谢谢您的回答。我正在JAX-RSREST服务实现RestEasy(运行在JBoss上)中使用它。无论如何,选项#3没有帮助(抽象类型的相同异常)。选项#2:我想对两个ser./desr使用相同的对象,所以我不能简单地更改JSON端,而它必须连接。选项#1将不同于XML输出。@d1x-Jackson不是与JAXB(JSR-222)兼容的实现,因此无法保证它将如何解释标准JAXB注释(这就是选项3可能不起作用的原因)。如果您对MOXy如何用于您的用例感兴趣,那么您可能会发现以下答案很有帮助: