JAXB和MOXy xml和json编组在球衣中的通用列表

时间:2014-03-19 08:57:28

标签: jaxb jersey jax-rs moxy

我在泽西岛做了一个小小的休息客户端,我在支持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;
    }
}

XML出来很好:

<?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>

但JSON格式如下

{
-elements : {
    -element: [
         - {
            id : 1
            title : "Title01"
        }
         - {
            id : 2
            title : "Title02"
        }
    ]
}
headerText : "HeaderText"
}

我当然会对没有&#34;元素&#34;感兴趣。我的JSON输出中的属性,只有elements: [{}...{}]

我已经设置了一个ContextResolver来创建一个MOXyConfig,其JSON_WRAPPER_AS_ARRAY_NAME属性 - 这适用于fx。一个List<String>,我只需要使用@XmlElement而不是@XmlElements来声明该属性。

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

2 个答案:

答案 0 :(得分:1)

JSON_WRAPPER_AS_ARRAY_NAME财产

JSON_WRAPPER_AS_ARRAY_NAME属性的效果(请参阅:http://blog.bdoughan.com/2013/03/binding-to-json-xml-handling-collections.html)取决于项目名称是否重要,

无关紧要的商品名称

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

@XmlElementWrapper(name = "elements")
@XmlElement(name = "element")
public List<E> getElements() {
    return elements;
}

重要商品名称

@XmlElements的情况下,项目名称是重要的,因为它告诉我们需要在unmarshal上实例化哪个类,并且不能被排除。

@XmlElementWrapper(name = "elements")
@XmlElements({
    @XmlElement(name = "foo", type=Foo.class),
    @XmlElement(name = "bar", type=Bar.class)
})
public List<E> getElements() {
    return elements;
}

你能做什么

您可以使用MOXy的外部映射文档覆盖elements属性的映射到以下内容:

@XmlElementWrapper(name = "elements")
@XmlElement(name = "foo")
public List<E> getElements() {
    return elements;
}

然后,XML的JAXBContext将基于注释,JSON的JAXBContext将基于annotatons和外部映射文档。

了解更多信息

答案 1 :(得分:1)

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