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