1

我需要将 json 转换为 xml,然后再将该 json 转换回 xml,但是在此转换时我丢失了 json 数组对象 - 我正在使用 org.json lib。

json字符串 -

{
    "readResult": {
        "errors": [{
            "code": 400
        }]
    }
}

代码库 - 使用 org.json 库

String xml = XML.toString(new JSONObject("inputjsonstring"));
String json = XML.toJSONObject(xml).toString();

输出 xml 和 json -

XML - <readResult><errors><code>400</code></errors></readResult>
JSON - 
{
        "readResult": {
            "errors": {
                "code": 400
            }
        }
}

在这里,这个 json 没有任何数组,因为它在原始 json 中。请建议替代图书馆做同样的事情。

4

4 回答 4

2

Json 规范说 json 可以有字符串、数字、布尔值、数组、对象和 null 等数据类型。

json 中的单元素数组是一种特殊情况,它会给 org.json 之类的一些 api 带来问题。因为这些库将单元素数组视为普通的 json 对象,而不是 json 数组对象。

为了解决这个问题,我们需要一个支持 Json 的所有数据类型的库。我们可以使用 xslt 转换来解决这个问题。在 XSLT 3.0 中有 2 个函数json-to-xml()xml-to-json()非常适合这个问题。我用这种方式解决了类似的问题。考虑到 json 的所有数据类型,这些函数将 json 转换为 xml,反之亦然。例如。在 json 中,如果您将值作为数字、布尔值或字符串库在转换时维护这些数据类型(xml 到 json,反之亦然,以便在 xml 中转换后,您可以在生成的 xml 中看到值的特定数据类型)。我们可以在生成的 xml 中看到,json 中的任何键始终是字符串类型。

更多关于以下链接 xslt 3.0 json-to-xml 和 xml-to-json 转换

检查以下 xsltfiddle 链接上的两个转换示例

json到xml的转换

https://xsltfiddle.liberty-development.net/6qVRKvS

从以前的 xml 中取回 Json

https://xsltfiddle.liberty-development.net/94hvTyU

下面是一个使用 XSLT 和 Saxon 9.8 HE 进行转换的完整 java 示例(HE 表示家庭版。它的开源产品提供了 XSLT (3.0) 的实现)

首先,您需要运行 json2XML.java,它将生成 outputSampleXML.xml。这个 outputSample.XML 将从 json 转换为 xml,并将作为我们下一个名为 xml2json.java 的程序的输入。该程序将返回包含单个数组元素的原始 json。

pom.xml 依赖

    <dependency>
        <groupId>net.sf.saxon</groupId>
        <artifactId>Saxon-HE</artifactId>
        <version>9.8.0-8</version>
    </dependency>
<!-- Below just to pretty print json on console-->
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.2</version>
    </dependency>

输入JSON.xml

<your_data_here>
{
    "Request": [{
        "price": "1400",
        "test": "dummydata"
    }]
}
</your_data_here>

json2xml.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">
    <xsl:output indent="yes" />
    <xsl:template match="your_data_here">
        <xsl:copy-of select="json-to-xml(.)" />
    </xsl:template>
</xsl:stylesheet>

json2XML.java

public class json2XML {
public static void simpleTransform(String sourcePath, String xsltPath, String resultDir) {
    TransformerFactory tFactory = TransformerFactory.newInstance();
    try {
        Transformer transformer = tFactory.newTransformer(new StreamSource(new File(xsltPath)));
        transformer.transform(new StreamSource(new File(sourcePath)), new StreamResult(new File(resultDir)));
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public static void main(String[] args) {
    simpleTransform("src/main/java/sampleJSON.xml", "src/main/java/json2xml.xsl",
            "src/main/java/outputSampleXML.xml");
    System.out.println("Done!!!");

}

}

outputSampleXML.xml

<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
   <array key="Request">
      <map>
         <string key="price">1400</string>
         <string key="test">dummydata</string>
      </map>
   </array>
</map>

xml2json.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">
  <xsl:output omit-xml-declaration="yes"/>
  <xsl:template match="/">
      <xsl:value-of select="xml-to-json(., map { 'indent' : true() })"/>
  </xsl:template>
</xsl:stylesheet>

xml2JSON.java

public class json2XML {
public static void simpleTransform(String sourcePath, String xsltPath, String resultDir) {
    TransformerFactory tFactory = TransformerFactory.newInstance();
    try {
        Transformer transformer = tFactory.newTransformer(new StreamSource(new File(xsltPath)));
        transformer.transform(new StreamSource(new File(sourcePath)), new StreamResult(new File(resultDir)));
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public static void main(String[] args) {
    simpleTransform("src/main/java/sampleJSON.xml", "src/main/java/json2xml.xsl",
            "src/main/java/outputSampleXML.xml");
    System.out.println("Done!!!");

}

}

运行 xml2JSON.java 时控制台上的输出

{
    "Request": [{
        "price": "1400",
        "test": "dummydata"
    }]
}

请注意,您可以将两个 xsl 文件都保存在 java String 对象中作为常量,并将它们用作转换器 java 代码中的 inputStream。这样您就不需要制作单独的 xsl 文件。但那是问题的另一部分,不必集中在这里。

于 2018-04-24T20:02:08.097 回答
1

Underscore-java可以将 json 转换为 xml,反之亦然。我是项目的维护者。

结果xml:

<?xml version="1.0" encoding="UTF-8"?>
<readResult>
  <errors array="true">
    <code number="true">400</code>
  </errors>
</readResult>
于 2019-11-12T00:39:41.397 回答
0

也许您可以通过此处描述的 JSON-XML 映射获得帮助:

JsonReaderWriterFactory生成的读取器和写入器提供基于 JavaScript 对象表示法 (JSON) 内容的 XML API。(来源

它可以转换:

{
    "readResult": {
        "errors": [{
            "code": 400
        }]
    }
}

至:

<root type="object">
    <readResult type="object">
        <errors type="array">
            <item type="object"><code type="number">400</code></item>
        </errors>
    </readResult>
</root>

注意:我还在JavaScriptPHP中实现了这种转换。

于 2017-03-25T11:57:58.137 回答
0

没有办法从 XML 字符串

<readResult>
     <errors>
           <code>400</code>
     </errors>
 </readResult>

,图书馆可以“猜测”这code是一个数组

要执行此类操作,您需要通过 Java 模型并使用诸如Jackson之类的库来重新生成 JSON

从 XML 映射到 Java 有几种替代方法:XStream就是其中之一

于 2017-03-20T10:51:58.240 回答