泽西岛通用列表的JAXB和MOXy xml和json编组

泽西岛通用列表的JAXB和MOXy xml和json编组,jaxb,jersey,jax-rs,moxy,Jaxb,Jersey,Jax Rs,Moxy,我在Jersey制作了一个小的restful客户端,在支持XML和JSON封送方面遇到了一些麻烦 具体的问题是封送包含一些属性的对象,并包含一个通用列表 我将以下类注释如下: @XmlRootElement public class Block<E> { private String headerText; private List<E> elements; public Block() { } @XmlElement

我在Jersey制作了一个小的restful客户端,在支持XML和JSON封送方面遇到了一些麻烦

具体的问题是封送包含一些属性的对象,并包含一个通用列表

我将以下类注释如下:

@XmlRootElement
public class Block<E> {

    private String headerText;

    private List<E> elements;

    public Block() {
    }

    @XmlElement
    public String getHeaderText() {
        return headerText;
    }

    @XmlElementWrapper(name = "elements")
    @XmlElements({
        @XmlElement(name = "element", type=Foo.class),
        @XmlElement(name = "element", type=Bar.class)
    })
    public List<E> getElements() {
        return elements;
    }
}
当然,我对JSON输出中没有“element”属性感兴趣,而只有
元素:[{}…{}]

我已经设置了一个
ContextResolver
,它创建了一个
MOXyConfig
,属性为
JSON\u WRAPPER\u AS\u ARRAY\u NAME
,这对fx很有效。一个
列表
,其中我只需使用
@xmlements
而不是
@xmlements
声明属性

任何知道此问题解决方案的人?

JSON\u包装器\u AS\u数组\u名称
属性
JSON\u WRAPPER\u AS\u ARRAY\u NAME属性(请参见:)的效果取决于项目名称是否重要

不重要的项目名称

下面我们知道集合中的每个项都是
Foo
的实例或
Foo
的子类的实例

@xmlementwrapper(name=“elements”)
@xmlement(name=“element”)
公共列表getElements(){
返回元素;
}
重要项目名称

@xmlmelements
的情况下,项名称很重要,因为它告诉我们需要在解组器上实例化哪个类,并且不能排除

@xmlementwrapper(name=“elements”)
@XmlElements({
@XmlElement(name=“foo”,type=foo.class),
@XmlElement(name=“bar”,type=bar.class)
})
公共列表getElements(){
返回元素;
}
你能做什么 可以使用MOXy的外部映射文档将elements属性的映射重写为以下内容:

@xmlementwrapper(name=“elements”)
@xmlement(name=“foo”)
公共列表getElements(){
返回元素;
}
然后,XML的
JAXBContext
将基于注释,JSON的
JAXBContext
将基于注释和外部映射文档

了解更多信息


尝试注册另一个JSON实体提供程序,这将自动禁用Moxy进行JSON编组()。如果启用例如Jackson,您将拥有自己的注释来控制如何编组所有内容。

通常,
@xmlements
注释中的
@xmlements
注释具有不同的名称。我注意到你给了他们同样的名字,这是故意的吗?
Foo
Bar
是同一继承层次结构的一部分吗?在这个基本模板代码中,我只使用了复制/粘贴,因此@xmlement注释中的名称相同。Foo和Bar可能是两个完全不同的类,它们之间可能没有任何关系。我有完全相同的问题。对我来说,它看起来像一只莫西虫子。您是否已经跟踪了它或通过任何解决方法解决了这个问题?我们选择将xml抛出窗口,而只是使用jackson作为提供者。Jackson的工作方式很有魅力,实际上在我看来,它更容易使用。类似的问题也可能出现在
@xmlementref
上。在我发现你的问题之前,我打开了一个。不幸的是,至少可以说,莫西似乎处于休眠状态-(没有解决我的问题。JSON输出格式仍然与主题中显示的相同,只是将“foo”或“bar”作为属性名而不是“element”.Cheers thoughI注册了jackson,这很好。我只想应用一种类型的注释,而不是两种,因为我必须同时支持xml和json。不过标记为有用的答案。谢谢:)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<block>
<elements>
    <element>
        <id>1</id>
        <title>Title01</title>
    </element>
    <element>
        <id>2</id>>
        <title>Title02</title>
    </element>
</elements>
<headerText>FooBarHeader</headerText>
</block>
{
-elements : {
    -element: [
         - {
            id : 1
            title : "Title01"
        }
         - {
            id : 2
            title : "Title02"
        }
    ]
}
headerText : "HeaderText"
}