我在泽西岛做了一个小小的休息客户端,我在支持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
来声明该属性。
知道此问题的解决方案的任何人?
答案 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,您将拥有自己的注释来控制所有内容的编组方式。