我正在 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/