Jersey 中通用列表的 JAXB 和 MOXy xml 和 json 编码

标签 jaxb jersey jax-rs moxy

我正在 Jersey 制作一个安静的小客户端,但我在支持 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"
}

我当然有兴趣在我的 JSON 输出中没有“元素”属性,而只有 elements: [{}...{}]

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

谁知道这个问题的解决方案?

最佳答案

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 的情况下,项目名称很重要,因为它告诉我们需要在解码时实例化哪个类并且不能排除。

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

你能做什么

您可以使用 MOXy 的外部映射文档将元素属性的映射覆盖为以下内容:

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

那么 XML 的 JAXBContext 将基于注释,而 JSON 的 JAXBContext 将基于注释和外部映射文档。

了解更多信息

关于 Jersey 中通用列表的 JAXB 和 MOXy xml 和 json 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22500636/

相关文章:

java - JAXB : Read non-static attributes into a collection

java - Jersey - 在运行时设置 REST 响应编码

java - JAX-RS 与 Jersey 和灰熊 : 500 Request failed for all requests

jax-rs - 关闭 Apache Aries 的默认网页

java - build() 方法对 JAX-RS 中的响应做什么?

java - 在 eclipse 中从 xsd 生成 JAXB 模型时出错

Java JAXB/MOXy - 序列化为 JSON 时包含子类类型作为值

java - JAXB 设置自顶向下解码

java - 什么类替换了 javax webservice API (javax.ws.rs-api) 中封存的 'ClientFactory'?

java - 将 Jetty 线程池的一部分专用于特定端点