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 文件。但那是问题的另一部分,不必集中在这里。