json xml 转换器在 json 字符串中包含数组

问题描述 投票:0回答:4

我需要将 json 转换为 xml,然后将该 json 转换回 xml,但是在转换过程中我丢失了 json 数组对象 - 我正在使用 org.json 库。

Json 字符串 -

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

代码库 - 使用 org.json lib

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 中的。请建议其他图书馆也这样做。

json jackson jettison jackson-dataformat-xml
4个回答
2
投票

Json 规范规定 json 可以有 string、number、boolean、array、object 和 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!!!");

}

}

输出SampleXML.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 文件。但这是问题的另一部分,不需要集中在这里。


1
投票

Underscore-java 能够将 JSON 转换为 XML,反之亦然。

生成的 xml:

<?xml version="1.0" encoding="UTF-8"?>
<readResult>
  <errors array="true">
    <code number="true">400</code>
  </errors>
</readResult>

0
投票

无法从 XML 字符串中得到

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

,库可以“猜测”

code
是一个数组

要做这些事情,您需要通过 Java 模型并使用诸如 Jackson 之类的库来重新生成 JSON

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


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 中实现了此转换。

© www.soinside.com 2019 - 2024. All rights reserved.