微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XML通过Jettison和JAXB将列表包装到JSON数组

我正在使用JAXB以一种形式将带注释的对象编组为 XML

<channels>
     <channel>Test A</channel>
     <channel>Test B</channel>
  </channels>

我想使用JAXB(ala http://blog.bdoughan.com/2011/04/jaxb-and-json-via-jettison.html)将其编组为JSON,但它会对以下内容进行编组:

"channels" : {
    "channel" : [ "Test A","Test B" ]
  },

我真的希望它能够编组成以下形式:

"channels" : {
    {"Test A"},{"Test B"}
  },

我怎样才能做到这一点?这是正确的做法吗?

解决方法

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

下面是使用EclipseLink JAXB(MOXy)中的JSON绑定来支持此用例的方法.

Java模型(根)

下面是我将用于此示例的Java模型.

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    private List<String> channels = new ArrayList<String>();

    @XmlElementWrapper
    @XmlElement(name="channel")
    public List<String> getChannels() {
        return channels;
    }

}

将MOXy指定为JAXB提供程序(jaxb.properties)

要将MOXy指定为JAXB提供程序,您需要在与域模型相同的包中包含一个名为jaxb.properties的文件,并带有以下条目(请参阅:):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示代码

在下面的演示代码中,我们将同一个实例输出到XML和JSON.

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);

        Root root = new Root();
        root.getChannels().add("Test A");
        root.getChannels().add("Test B");

        // Output XML
        marshaller.marshal(root,System.out);

        // Output JSON
        marshaller.setProperty(MarshallerProperties.MEDIA_TYPE,"application/json");
        marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT,false);
        marshaller.setProperty(MarshallerProperties.JSON_WRAPPER_AS_ARRAY_NAME,true);
        marshaller.marshal(root,System.out);
    }

}

产量

以下是运行演示代码输出

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <channels>
      <channel>Test A</channel>
      <channel>Test B</channel>
   </channels>
</root>
{
   "channels" : [ "Test A","Test B" ]
}

欲获得更多信息

> http://blog.bdoughan.com/2013/03/binding-to-json-xml-handling-collections.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。