Java 在我得到XML数据之后,如何解析它并将其转换为JSON?

Java 在我得到XML数据之后,如何解析它并将其转换为JSON?,java,xml,json,jakarta-ee,jersey,Java,Xml,Json,Jakarta 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 x

在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,实现这一点的最佳方法是什么?

最简单和最简单的方法是使用org.JSON包:

除了必要的导入语句外,只需这一行就可以了

既然我已经提到了org.json库,很多人可能会对它发表不好的评论。记住,我说的是最简单、最容易的方法,不是最好或最有效的方法;-)

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

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

org.json
json
20090211

如果您的服务尚未提供JSON作为选项(如果您将MediaType.APPLICATION\u XML更改为MediaType.APPLICATION\u JSON会发生什么情况?),那么我相信您有一些选项,我会按偏好顺序列出

选项1:您有一个数据的XML模式 如果您有一个用于返回XML的XML模式,那么可以使用xjc生成带JAXB注释的java类,然后利用它将实例转换为JSON数据。我认为这会让你更快地利用这些库而不是自己进行解析。Jackson是一个健壮的库,glassfish将其用于Jersey(JAX-RS)实现,我觉得依赖这个库不会有任何风险

选项2:使用json.org库,但是我发现这个库在基于反射的方法等方面有很大的问题。也就是说,它可能适合您……您可以相对轻松地进行测试,看看它是否满足您的要求。如果是这样的话……你就完了!=)

选项3:您没有XML模式和/或您想要更多的控制 正如@Falcon所指出的,您总是可以使用传统的XML解析技术将XML解析为您想要的任何内容。我倾向于SAX解析,但DOM可以根据xml端工作

问候,


Steve

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

检查。如果您有一个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);
    });

一般来说,如果不需要的话,永远不要直接从XML转换为JSON(反之亦然)。 相反,将数据从XML或JSON绑定到POJO,然后进行其他转换。虽然这似乎不直观,但这会导致更干净的结果和更少的问题,因为POJO和数据格式之间的转换有更多的选项、成熟、设计良好的LIB;POJO和POJO更易于配置(带有注释),并且有更多元数据来指导转换过程。 直接转换LIB(如抛弃,见下文)存在各种问题;通常会产生“franken JSON”,JSON在技术上是正确的,但由于转换需要添加构造,因此看起来很陌生

在Jersey的情况下,则使用JAXB实现从POJO到XML的转换,并使用JSON实现同样的转换。不管怎样,这些都是图书馆;而且直接使用也很容易


如果您绝对坚持直接转换,您可以尝试,但如果需要列表、数组和映射,请准备好遇到问题(特别是单元素数组——数组对XML有问题,自动转换经常出错).

为什么不直接向Jersey询问数据的json表示形式?因为较低级别的接口将xml数据传输给我,我需要将其转换为JSONY。您可以使用Sax或Dom解析器解析数据。您好,谢谢您的回答,您能为您的选项1提供一个示例或教程吗?@Steve Siebert,“我将等待您的进一步答复,谢谢。”梅隆-是的,没问题。我从一个实际的教程开始,希望确保这个场景能够涵盖您正在寻找的内容,因为这也是我可以用于本地培训的内容。您正在编写移动应用程序,需要使用仅提供XML的第三方RESTful Web服务。为了节省带宽和处理,您决定使用Jersey创建一个RESTful代理,该代理接收来自移动应用程序的请求,向第三方RESTful端点发出请求,并返回JSON。你相信这能满足你的需要吗?@Steve siebert,我正在写一个web应用程序。我需要使用第三方RESTful web服务,它只返回XML数据(将来可能使用RMI实现POJO)。我的web应用程序的javascript向我的RESTful jersey发送ajax调用以请求JSON数据。然后,我的jersey服务器向第三方服务发送请求,该服务将xml数据作为响应返回给我。因此,我的jersey服务器需要解析返回的xml数据并将其转换为JSON数据,然后在我的web应用程序中将其作为响应传递给我的Javascript。@Steve siebert,由于我没有第三方JAXB bean模型,我想知道,在获得xml数据后,如何解析它以获得xml数据中某个元素的特定值。例如,我的运动衫可以像TOYOTA13一样获取xml数据,那么如何从xml字符串数据中获取汽车名称值呢?我没有第三方JAXB beam模型,我不能使用“JAXBElement jaxbContact=r.path(“13”).type(MediaType.APPLICATION_XML).get(generic);”
// 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);
    });