泽西岛通用列表的JAXB和MOXy xml和json编组
我在Jersey制作了一个小的restful客户端,在支持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
@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"
}