获得XML数据后,如何解析它并转移到JSON?

时间:2011-04-13 14:13:10

标签: java xml json java-ee jersey

在Jersey RESTful框架工作中,我知道我可以在客户端获取xml数据如下:

private static final String BaseURI = "http://DOMAN.com";

ClientConfig config = new DefaultClientConfig();

Client client = Client.create(config);

WebResource service = client.resource(BaseURI);

String xmlData = service.path("rest").path("todos").accept(
                MediaType.APPLICATION_XML).get(String.class)

我的问题是如何解析xmlData呢?我想从xmlData获取所需数据,并将所需数据传输到 JSON ,实现此目的的最佳方式是什么?

6 个答案:

答案 0 :(得分:1)

作为一般规则,如果您不需要,不要直接从XML转换为JSON(反之亦然)。 而是将XML或JSON中的数据绑定到POJO,然后执行其他转换。虽然它可能看起来不直观,但结果更清晰,问题更少,因为POJO和数据格式之间的转换有更多的选择,成熟,设计良好的库;和POJO更容易配置(带注释),并有更多的元数据来指导转换过程。 直接转换库(如Jettison,见下文)受到各种问题的困扰;经常产生“franken-JSON”,JSON在技术上是正确的,但由于转换所需的附加构造而看起来很陌生。

如果是Jersey,则使用JAXB for XML /来自POJO,使用Jackson来执行与JSON相同的操作。这些是泽西岛使用的库;直接使用非常简单。

如果你绝对坚持直接转换,你可以尝试Jettison,但是如果你需要它,可以准备好解决列表,数组和地图的问题(特别是单元素数组 - 数组有问题)使用XML,自动转换经常出错。)

答案 1 :(得分:0)

最简单,最简单的方法是使用 org.json 包:http://json.org/javadoc/org/json/XML.html

XML.toJSONObject(xmlData).toString()

除了必要的import语句之外,只需要这一行即可完成所有操作。

既然我已经提到过org.json库,很多人可能会对它评论不好。请记住,我已经说过最简单,最简单的方法,而不是最好或最高效的方式; - )

如果您使用的是maven,请添加此依赖项:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20090211</version>
</dependency>

答案 2 :(得分:0)

如果您的服务不提供JSON作为选项(如果您将MediaType.APPLICATION_XML更改为MediaType.APPLICATION_JSON会怎样?),那么我相信您有几个选项,我按照我的喜好列出。< / p>

选项1:您拥有数据的XML架构 如果您有返回XML的XML模式,则可以使用xjc生成带注释的JAXB类,然后利用jackson将实例转换为JSON数据。我认为通过利用这些库而不是自己解析,这将使你快速前进。 Jackson是一个强大的库,由glassfish用于他们的Jersey(JAX-RS)实现,我觉得依赖这个库没有任何风险。

选项2:使用json.org库,但我的这个库与其基于反射的方法等有关的重大问题。也就是说,它可能适合你...而且你可以相对容易地测试,看它是否符合您的要求。如果是这样......你已经完成了! =)

选项3:您没有XML架构和/或您想要更多控制 正如@Falcon指出的那样,您始终可以使用传统的XML解析技术将XML解析为您想要的任何内容。我偏爱SAX解析,但DOM可以工作,具体取决于xml端

此致

史蒂夫

答案 3 :(得分:0)

您是否可以访问生成XML的“低级接口”?如果这样做,唯一需要的更改是使用“@XmlRootElement”注释xml对象。然后,您可以将XML对象作为JSON传回,而无需任何其他代码。

答案 4 :(得分:0)

检查Jsonix。如果您有XML模式,则可以在JavaScript中生成XML-JSON映射和解组/编组XML。非常类似于JAXB(Steve Siebert提到的),但在客户端工作。

// The PO variable provides Jsonix mappings for the purchase order test case
// Its definition will be shown in the next section

var PO = { };

// ... Declaration of Jsonix mappings for the purchase order schema ...

// First we construct a Jsonix context - a factory for unmarshaller (parser)
// and marshaller (serializer)
var context = new Jsonix.Context([ PO ]);

// Then we create an unmarshaller
var unmarshaller = context.createUnmarshaller();

// Unmarshal an object from the XML retrieved from the URL
unmarshaller.unmarshalURL('/org/hisrc/jsonix/samples/po/test/po-0.xml',
    // This callback function will be provided with the result
    // of the unmarshalling
    function(result) {
        // We just check that we get the values we expect
        assertEquals('Alice Smith', result.value.shipTo.name);
        assertEquals('Baby Monitor', result.value.item[1].productName);
    });

答案 5 :(得分:0)

愿这个链接可以帮到你。 JAX-b And castor mapping