2011-04-13 33 views
0

在新泽西州的RESTful框架的工作,我知道我可以在客户端获取XML数据如下:获取XML数据后,如何解析并传输到JSON?

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,实现此目的的最佳方法是什么?

+1

为什么不直接向Jersey请求数据的json表示? – 2011-04-13 14:16:14

+0

由于低层接口转移到我xml数据,我需要转换为json – Mellon 2011-04-13 14:20:12

+0

您可以使用萨克斯或Dom分析器来解析数据 – Premraj 2011-04-13 14:27:43

回答

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> 
0

如果你的服务不提供JSON作为选项(如果将MediaType.APPLICATION_XML更改为MediaType.APPLICATION_JSON,会发生什么情况?),那么我相信您有几个选项,我按照自己的偏好排列。

选择1:你的数据 如果你对返回的XML的XML架构,您可以使用XJC生成JAXB注解的Java类,然后利用jackson的情况下转换成JSON数据的XML模式。我认为这会让你通过利用这些库来解析你自己而快速发展。 Jackson是一个功能强大的库,被glassfish用于他们的泽西岛(JAX-RS)实施,我不觉得依靠这个库有任何风险。

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

选项3:您没有XML架构和/或您希望更多控制 作为@Falcon指出的,您始终可以使用传统的XML解析技术将XML解析为任何您想要的内容。我偏爱SAX解析,但DOM可以根据XML侧

问候工作,

史蒂夫

+0

嗨,谢谢你的答案,你可以提供一个例子或教程为您的选项1 ? – Mellon 2011-04-13 18:10:17

+0

@Steve Siebert,我会等待你的进一步回应,谢谢。 – Mellon 2011-04-14 06:36:50

+0

@Mellon - 是的,没问题。我开始写一篇实际的教程,并且希望确保这个场景能够覆盖你正在寻找的内容,因为它也可以用于本地培训。 您正在编写一个移动应用程序,需要使用仅提供XML的第三方RESTful Web服务。为了节省带宽和处理,您决定使用Jersey创建一个RESTful代理,该代理从您的移动应用接收请求,向第三方RESTful端点发出请求并返回JSON。 你相信这会满足你的需求吗? – 2011-04-14 07:18:15

0

你有到生成XML的“下级界面”任何访问?如果你这样做,唯一需要改变的是使用“@XmlRootElement”注解xml对象。然后,您可以将XMLobject作为JSON传回,而无需任何其他代码。

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

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

在Jersey的情况下,然后使用JAXB作为POJO的XML,Jackson与JSON一样。这些是泽西使用的图书馆;直接使用非常简单。如果你绝对坚持直接转换,你可以尝试Jettison,但是如果你需要它们,准备好用列表,数组和地图来解决问题(特别是单元素数组 - 数组对XML有问题,并且自动转换经常出错)。