【问题标题】:How does MOXy handle empty arraysMOXy 如何处理空数组
【发布时间】:2012-05-04 17:27:33
【问题描述】:

在我的 Jersey 项目中,我使用 MOXy 编组到 JSON 或从 JSON 编组。我要编组的类之一是一个可以为空的字符串数组。

class Data
{
   @XmlElement(nillable = true) public String[] array;
}

在数组为空的情况下,我希望输出为:

{ 
   "array" : []
}

但是看起来 MOXy 正在从输出中过滤掉空数组。如何让它在输出中包含空数组?

我正在考虑将 JSONConfiguration.mapped().array("array").build() 添加到 MOXy 提供程序构造函数中,但这似乎没有什么不同(我什至不确定它是否正确的解决方案)。

【问题讨论】:

    标签: jaxb jersey moxy


    【解决方案1】:

    注意:我是EclipseLink JAXB (MOXy) 领导,也是JAXB 2 (JSR-222) 专家组的成员。

    原始答案

    已输入以下增强请求。您可以使用下面的链接来跟踪我们在此问题上的进展。


    更新

    从 2012 年 5 月 19 日的 EclipseLink 2.4.0 标签开始,您可以设置以下属性来获取您正在寻找的行为。

    marshaller.setProperty(MarshallerProperties.JSON_MARSHAL_EMPTY_COLLECTIONS, true);
    

    您可以从以下位置下载夜间 EclipseLink 标签:

    在下面的类中,我们有三个List 属性。 List 对象中有两个是空的,一个是空的。请注意,emptyChoiceList 字段与@XmlElements 映射。 @XmlElements 注释指出可能的节点名称是 foobar

    package forum10453441;
    
    import java.util.*;
    import javax.xml.bind.annotation.*;
    
    @XmlType(propOrder={"nullList", "emptyList", "emptyChoiceList"})
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Root {
    
        private List<String> nullList = null;
    
        private List<String> emptyList = new ArrayList<String>();
    
        @XmlElements({
            @XmlElement(name="foo", type=String.class),
            @XmlElement(name="bar", type=String.class)
        })
        private List<String> emptyChoiceList = new ArrayList<String>();
    
    }
    

    演示

    以下代码演示了如何指定MarshallerProperties.JSON_MARSHAL_EMPTY_COLLECTIONS 属性。

    package forum10453441;
    
    import javax.xml.bind.*;
    import org.eclipse.persistence.jaxb.MarshallerProperties;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(Root.class);
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
            marshaller.setProperty(MarshallerProperties.JSON_MARSHAL_EMPTY_COLLECTIONS, true);
    
            Root root = new Root();
            marshaller.marshal(root, System.out);
        }
    
    }
    

    输出

    现在在输出中,空列表被编组为空数组。对于使用 @XmlElememts 映射的字段,指定的节点名称用于 JSON 表示。

    {
       "emptyList" : [ ],
       "foo" : [ ]
    }
    

    【讨论】:

    • 谢谢。我们通过使用 Gson 序列化这个特殊案例来解决这个问题。很高兴看到由此产生的增强。当它准备好时,我们可能会切换回它。
    • @Oleksi - 我们添加了对您描述的用例的支持。我已经用一个完整的例子更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2020-11-13
    相关资源
    最近更新 更多