我需要将json转换为xml,然后将json转换回xml,但是在转换时我丢失了json数组对象 - 我正在使用org.json lib。
Json String -
{
"readResult": {
"errors": [{
"code": 400
}]
}
}
Codebase - 使用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中的任何数组。请建议备用库来做同样的事情。
答案 0 :(得分:1)
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 and xml-to-json conversion
检查以下xsltfiddle链接
上的两个转换示例https://xsltfiddle.liberty-development.net/6qVRKvS
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。
<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>
<your_data_here>
{
"Request": [{
"price": "1400",
"test": "dummydata"
}]
}
</your_data_here>
<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>
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!!!");
}
}
<?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>
<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>
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!!!");
}
}
{
"Request": [{
"price": "1400",
"test": "dummydata"
}]
}
请注意,您可以将java String对象中的xsl文件保留为常量,并在变换器java代码中将它们用作inputStream。这样您就不需要制作单独的xsl文件了。但这是问题的另一部分,不需要集中在这里。
答案 1 :(得分:0)
无法从XML字符串
中获取<readResult>
<errors>
<code>400</code>
</errors>
</readResult>
,库可以“猜测”code
是一个数组
要做这些事情,您需要通过Java模型并使用诸如Jackson之类的库来重新生成JSON
有几种从XML映射到Java的替代方法:XStream是其中之一
答案 2 :(得分:0)
也许您可以通过此处描述的JSON-XML映射获得帮助:
JsonReaderWriterFactory生成的读者和作者通过JavaScript Object Notation(JSON)内容提供XML API。 (source)
它可以转换:
{
"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>
注意:我还在JavaScript和PHP中实施了此转化。
答案 3 :(得分:0)
Underscore-java可以将json转换为xml,反之亦然。我是该项目的维护者。
结果xml:
<?xml version="1.0" encoding="UTF-8"?>
<readResult>
<errors array="true">
<code number="true">400</code>
</errors>
</readResult>