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

时间:2017-03-20 09:56:24

标签: json jackson jettison jackson-dataformat-xml

我需要将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中的任何数组。请建议备用库来做同样的事情。

4 个答案:

答案 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链接

上的两个转换示例

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>

inputJSON.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"
    }]
}

请注意,您可以将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>

注意:我还在JavaScriptPHP中实施了此转化。

答案 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>