在java中将带有名称空间的xml转换为json

在java中将带有名称空间的xml转换为json,java,json,xml,namespaces,converters,Java,Json,Xml,Namespaces,Converters,我正在尝试使用java将xml转换为json,然后在修改后将json转换回xml,这应该得到相同的xml。xml属性具有名称空间 我的示例xml: <?xml version="1.0" encoding="UTF-8"?> <ns2:testplan xmlns:ns2="http://jazz.net/xmlns/alm/qm/v0.1/" xmlns:ns1="http://schema.ibm.com/vega/2008/" xmlns:ns3="http://purl

我正在尝试使用java将xml转换为json,然后在修改后将json转换回xml,这应该得到相同的xml。xml属性具有名称空间

我的示例xml:

<?xml version="1.0" encoding="UTF-8"?>
<ns2:testplan xmlns:ns2="http://jazz.net/xmlns/alm/qm/v0.1/" xmlns:ns1="http://schema.ibm.com/vega/2008/" xmlns:ns3="http://purl.org/dc/elements/1.1/" xmlns:ns4="http://jazz.net/xmlns/prod/jazz/process/0.6/" xmlns:ns5="http://jazz.net/xmlns/alm/v0.1/" xmlns:ns6="http://purl.org/dc/terms/" xmlns:ns7="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ns8="http://jazz.net/xmlns/alm/qm/v0.1/testscript/v0.1/" xmlns:ns9="http://jazz.net/xmlns/alm/qm/v0.1/executionworkitem/v0.1" xmlns:ns10="http://open-services.net/ns/core#" xmlns:ns11="http://open-services.net/ns/qm#" xmlns:ns12="http://jazz.net/xmlns/prod/jazz/rqm/process/1.0/" xmlns:ns13="http://www.w3.org/2002/07/owl#" xmlns:ns14="http://jazz.net/xmlns/alm/qm/qmadapter/v0.1" xmlns:ns15="http://jazz.net/xmlns/alm/qm/qmadapter/task/v0.1" xmlns:ns16="http://jazz.net/xmlns/alm/qm/v0.1/executionresult/v0.1" xmlns:ns17="http://jazz.net/xmlns/alm/qm/v0.1/catalog/v0.1" xmlns:ns18="http://jazz.net/xmlns/alm/qm/v0.1/tsl/v0.1/" xmlns:ns20="http://jazz.net/xmlns/alm/qm/styleinfo/v0.1/" xmlns:ns21="http://www.w3.org/1999/XSL/Transform">
<ns2:projectArea href="https://testserver:9080/qm/resource/itemOid/com.ibm.team.process.ProjectArea/_xv6jsJceEeimbPqnRT_G_Q" alias="projectArea"/>
<ns3:identifier>https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/projectArea/testplan/urn:com.ibm.rqm:testplan:70?revision=294</ns3:identifier>
<ns2:stylesheet href="https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/projectArea/testplan/urn:com.ibm.rqm:testplan:70?stylesheet=true"/>
<ns2:snapshot>
<ns3:title>testplan_70_&lt;Reason&gt;_&lt;Version&gt;_on_16 Apr 2019 05:50</ns3:title>
<ns5:updated>2019-04-16T12:20:01.644Z</ns5:updated>
<ns2:revision>294</ns2:revision>
</ns2:snapshot>
<ns2:webId>70</ns2:webId>
<ns3:title>Demo test plan 06</ns3:title>
<ns3:description/>
<ns2:creationDate>2019-01-22T10:36:40.289Z</ns2:creationDate>
<ns5:updated>2019-04-16T12:20:01.644Z</ns5:updated>
<ns5:state ns7:resource="https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/process-info/_xv6jsJceEeRT_G_Q/workflowstate/com.ibm.rqm.process.testplan.workflow/com.ibm.rqm.planning.common.underreview">com.ibm.rqm.planning.common.underreview</ns5:state>
<ns3:creator ns7:resource="https://testserver:9080/jts/resource/itemName/com.ibm.team.repository.Contributor/JLO1COB">abc</ns3:creator>
<ns5:owner>unassigned</ns5:owner>
<ns2:priority ns7:resource="https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/process-info/_xv6jsJceEeimbPqnG_Q/priority/literal.priority.101">literal.priority.101</ns2:priority>
<ns2:locked>false</ns2:locked>
<ns2:component href="https://testserver:9080/qm/service/com.ibm.rqm.integration.service.IIntegrationService/resources/projectArea/component/_yzQ3EZcmbPqnRT_G_Q"/>
</ns2:testplan>
我希望有一种转换方式,可以提供具有适当格式的Json和具有名称空间的Json对象,如果我转换这个Json,它应该提供初始xml
请帮帮我。

您可以试试jackson提供的XmlMapper(com.fasterxml.jackson.dataformat.xml.XmlMapper)

编辑:我使用过的依赖项

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.0</version>
</dependency>
<dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.9.0</version>
</dependency>

com.fasterxml.jackson.core
杰克逊数据绑定
2.9.0
com.fasterxml.jackson.dataformat
jackson数据格式xml
2.9.0

获取一个
JSONObject
并将其转换为JSON字符串:

JSONObject jsonObject = XML.toJSONObject("xml");
String jsonString = jsonObject.toString();
如果您想漂亮地打印字符串,请使用
toString(int)
,它将空格数作为参数

String prettyPrintedJson = jsonObject.toString(4);

我的意思是,JSON中没有名称空间这样的东西,所以…JSON中没有名称空间这样的东西。但是如果我们把xml转换成json,json对象可以有名称空间,我不知道你的意思。你应该提供例子。但是,当某个东西一开始就没有名称空间时,就不会有神奇的情况使它现在有名称空间。JSON没有名称空间。所以,没有什么能让它有名称空间。是的,我知道,json不会有名称空间。但是jsonObject或键可以是正确的。我已经给出了上面的xml,xml具有名称空间。我需要将此xml转换为json,并修改json中的某些值并将其转换回。因此,当我将其转换回xml时,我需要正确地返回名称空间,以便使其成为有效的json名称名称空间本质上是元素名称的一部分:它们总是相同的。不要将名称空间放在JSON中,只使用足够唯一的名称,这样它们就不需要在名称空间中分开。然后在将其转换回XML时,将名称空间放回原处。没有一个库会为您进行这样的转换,首先从XML转换为对象,然后从对象转换为JSON,然后反过来。您好,感谢您的快速响应。您能告诉我所有依赖项都需要什么吗?应该是“Jackson Dataformat XML”2.9.0版(或更高版本?)编辑:添加了要回答的依赖项。我已经添加了您建议的依赖项。但我现在犯了个错误。由以下原因引起:java.lang.ClassNotFoundException:org.codehaus.stax2.io.Stax2ByteArraySource,位于此行JsonNode JsonNode=xmlMapper.readTree(string.getBytes());XmlMapper从何处导入?添加了另一个依赖项。@Ajith,您需要“stax2 api”jar文件。如果你有一个Maven项目,它会下载额外的jar文件。我的项目不是Maven,我按照建议只导入了这两个jar文件(jackson databind和jackson dataformat xml),并得到了相同的错误。在创建了一个Maven项目并尝试添加依赖项之后,我看到了其他jar文件。stax2-api-3.1.4.jar就是其中之一,您可能还需要其他jar。
JSONObject jsonObject = XML.toJSONObject("xml");
String jsonString = jsonObject.toString();
String prettyPrintedJson = jsonObject.toString(4);