使用球衣将空集合编组到json

时间:2011-11-21 09:59:57

标签: json jaxb jersey

我有一个奇怪的问题,即使用基于jaxb的json支持的jersey将空对象集合编组到json。我的对象看起来像

...
@XmlWrapper(name = "stuff") @XmlElement(name = "s")
private List<Foo> foos;
...

将此编组到json会产生预期的结果

... stuff: [{ "s": ... }, { "s": ... }] ...

除非列表为空。我希望看到

... stuff: [] ...

但是我看到了

... stuff: [null] ...

代替。 任何想法是什么问题?问题似乎与@XmlElementWrapper注释有关,删除它我根本没有得到输出中的stuff属性。

3 个答案:

答案 0 :(得分:0)

您是在序列化一个空列表,还是在序列化一个未实例化的空对象?

即。我希望:

private List<Foo> foos; - would serialize to 'stuff: [null]'

我也希望:

private List<Foo> foos = new ArrayList<Foo>(); - we serialize to 'stuff: []'

如果不是这种情况,您可以随时将Jackson(与Jersey捆绑的默认JSON序列化程序)指向omit the writing of bean properties as null value.

答案 1 :(得分:0)

我建议使用基于Jackson的POJO映射。我不确定为什么你想要那个中间的“s”,但是POJO会产生(和消耗)更简单的结构:

"stuff" : [ { ... }, { ... } ]

为此,您不需要使用POJO映射注释;只有XML处理才需要JAXB注释,因为XML没有自然的机制来区分数组和对象(与JSON不同)。

答案 2 :(得分:0)

我设法在Jersey json库中解决JSON数组和原始字段“bug”。秘密成分是JSONConfiguration和ContextResolver魔术。请参阅我的以下帖子,它有一个完整的代码示例,自定义的ContextResolver和rest Application类在初看起来可能有点模糊逻辑。

How to serialize Java primitives using Jersey REST

  • 用于零或单元素Java列表的json数组
  • 没有引用字符的原始整数或布尔字段