【问题标题】:XML wrapped list to JSON array via Jettison and JAXB通过 Jettison 和 JAXB 将 XML 包装列表转换为 JSON 数组
【发布时间】:2013-05-12 20:00:00
【问题描述】:

我正在使用 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"}
  },

我该怎么做?这样做对吗?

【问题讨论】:

  • 你不想拥有:"channels" : ["Test A", "Test B"]

标签: xml json jaxb jettison


【解决方案1】:

注意:我是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" ]
}

更多信息

【讨论】:

    【解决方案2】:

    最简单的方法可能是将您的 JAXB 模型转换为经过调整的 JSON 模型。

    你会这样做:

    1. 实例化 JAXB 模型
    2. 将其转换为 JSON 模型
    3. 编组 JSON 模型

    根据您实例化 JAXB 模型的方式,您可能希望直接实例化 JSON 模型。

    【讨论】:

    • 你能举个简单的例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    相关资源
    最近更新 更多