JSON到XML转换的Java实现[关闭]

Posted

技术标签:

【中文标题】JSON到XML转换的Java实现[关闭]【英文标题】:Java implementation of JSON to XML conversion [closed] 【发布时间】:2010-10-08 05:46:57 【问题描述】:

是否有现有的 JAR 可用于从 JSON 转换为 XML?

【问题讨论】:

Underscore-java 库有静态方法 U.jsonToXml(json)。它是一个 jar 文件。有适用于 java 6、8 和 11 的版本。我是项目的维护者。 【参考方案1】:

您可以创建一个JSONObject,然后使用 org.json 命名空间中的XML class 将其转换为 XML

在对象中包装 json 字符串就像在其构造函数中传递它一样简单

JSONObject o = new JSONObject(jsonString);

然后您可以使用 XML 类以 XML 格式获取它,如下所示:

String xml = org.json.XML.toString(o);

【讨论】:

这非常简单,谢谢! 你能详细说明一下吗?我的意思是我必须使用外部 jars 吗?eclipse 无法识别这些命令 你可以试试这个:mvnrepository.com/artifact/org.codeartisans/org.json/20130603 @AnkitSrivastava,可以从github.com/douglascrockford/JSON-java (json.org/java) 下载类 JSONObjectXML 的源 java 文件。不过,您仍然必须自己制作罐子。但是,如果您使用的是 Google App Engine,则可以在 com.google.appengine.labs.repackaged.org.json.* 中找到 JSONObject 和 XML 类 JSONObject jsonObject = new JSONObject(json.toString())...这行抛出错误说“没有找到适合 JSONObject(String) 的构造函数”【参考方案2】:

不是 Java,而是纯 XSLT 2.0 实现

看看f:json-document() 来自FXSL 2.x library

使用此功能可以非常轻松地合并 JSon 并将其用作... XML。

例如,只需编写以下 XPath 表达式:

f:json-document($vstrParam)/Students/*[sex = 'Female']

sex = 'Female'获取Students的所有子节点

这是完整的示例:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:f="http://fxsl.sf.net/"
 exclude-result-prefixes="f xs"
 >
 <xsl:import href="../f/func-json-document.xsl"/>

 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vstrParam" as="xs:string">


  "teacher":
    "name":
      "Mr Borat",
    "age":
      "35",
    "Nationality":
      "Kazakhstan"
             ,


  "Class":
    "Semester":
      "Summer",
    "Room":
      null,
    "Subject":
      "Politics",
    "Notes":
      "We're happy, you happy?"
           ,

  "Students":
    
      "Smith":
        "First Name":"Mary","sex":"Female",
      "Brown":
        "First Name":"John","sex":"Male",
      "Jackson":
        "First Name":"Jackie","sex":"Female"
    
    ,


  "Grades":

    
      "Test":
      [
        "grade":"A","points":68,"grade":"B","points":25,"grade":"C","points":15,

        "grade":"C","points":2, "grade":"B","points":29, "grade":"A","points":55,

        "grade":"C","points":2, "grade":"A","points":72, "grade":"A","points":65
       ]
    



 </xsl:variable>

 <xsl:template match="/">
    <xsl:sequence select=
     "f:json-document($vstrParam)/Students/*[sex = 'Female']"/>

 </xsl:template>
</xsl:stylesheet>

当上述转换应用于任何 XML 文档(忽略)时,会产生正确的结果

<Smith>
   <First_Name>Mary</First_Name>
   <sex>Female</sex>
</Smith>
<Jackson>
   <First_Name>Jackie</First_Name>
   <sex>Female</sex>
</Jackson>

【讨论】:

看起来不错。但我试过 f:json-document() 总是返回一个空文档。我在 SF.net 论坛上发布了这个:sourceforge.net/forum/message.php?msg_id=7385342 有一个如何使用这个功能的例子。它是 Tests 文件夹中的 testFunc-json-document.xsl 文件:fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/Tests/… 当应用于任何 XML 文件(未使用)时,此转换会产生正确的结果。可能导致您的问题的一个潜在因素是使用相对较旧的 Saxon 版本——请使用 Saxon 的 9.x 版本。此外,您消息中的链接无法访问。【参考方案3】:

另一种可能性:Jettison,http://jettison.codehaus.org 可以通过 XML 解析接口 (stax XMLStreamReader) 公开 Json,这允许与只理解 XML 的系统集成。它需要使用约定(badgerfish 或其他任何名称)。

例如,XStream 使用 Jettison(或至少是 Badgerfish 约定)来允许使用 JSON。

但问题本身有点模糊:虽然您总是可以从一个转换为另一个(这确实是一件非常微不足道的事情),但 XML 和 JSON 并不等价:没有一对一的无损通用映射。 因此,问题是:您打算如何处理结果,如何使用生成的 xml?

【讨论】:

【参考方案4】:

http://json-lib.sourceforge.net/

以上关于没有完全万无一失的一对一映射的观点是有效的,但我在使用上述库将 xml 转换为 json 方面有很好的经验。

【讨论】:

【参考方案5】:

您可能想尝试 XStream。看看http://x-stream.github.io/faq.html#JSON。

【讨论】:

【参考方案6】:

你可以试试https://github.com/lukas-krecan/json2xml,它提供了简单的 JSON 到 XML 的转换。它采用 Jackson JSON 解析器并使用它来发出 SAX 事件。

【讨论】:

【参考方案7】:

Conversion Box!!!

我正在使用 Dimitre 在其回复中粘贴并已转换为 XML 的 JSON。让我们看看它是否适合你.....

import org.json.me.JSONObject;

import cjm.component.cb.xml.ToXML;

public class Test

public static void main(String[] args)

    try
    
        JSONObject objectJSON = new JSONObject();

        objectJSON.put("ROOT", (new JSONObject("\"teacher\":\"name\":\"Mr Borat\",\"age\":\"35\",\"Nationality\":\"Kazakhstan\",\"Class\":\"Semester\":\"Summer\",\"Room\":null,\"Subject\":\"Politics\",\"Notes\":\"We're happy, you happy?\",\"Students\":\"Smith\":\"FirstName\":\"Mary\",\"sex\":\"Female\",\"Brown\":\"FirstName\":\"John\",\"sex\":\"Male\",\"Jackson\":\"FirstName\":\"Jackie\",\"sex\":\"Female\",\"Grades\":\"Test\":[\"grade\":\"A\",\"points\":68,\"grade\":\"B\",\"points\":25,\"grade\":\"C\",\"points\":15,\"grade\":\"C\",\"points\":2,\"grade\":\"B\",\"points\":29,\"grade\":\"A\",\"points\":55,\"grade\":\"C\",\"points\":2,\"grade\":\"A\",\"points\":72,\"grade\":\"A\",\"points\":65]")));

        System.out.println("JSON: " + objectJSON);

        StringBuilder xml = new ToXML().convertToXML(objectJSON, true); // Conversion Box!!!!

        System.out.println("XML: " + xml);
    
    catch (Exception e)
    
        e.printStackTrace();
    


输出:

JSON: "ROOT":"Students":"Brown":"FirstName":"John","sex":"Male","Jackson":"FirstName":"Jackie","sex":"Female","Smith":"FirstName":"Mary","sex":"Female","Class":"Subject":"Politics","Room":null,"Semester":"Summer","Notes":"We're happy, you happy?","Grades":"Test":["points":15,"grade":"C","points":55,"grade":"A","points":65,"grade":"A"],"teacher":"age":"35","name":"Mr Borat","Nationality":"Kazakhstan"
 -------- JSON Detected -------- 
 -------- XML created Successfully -------- 
XML: <ROOT><Students><Brown><FirstName>John</FirstName><sex>Male</sex></Brown><Jackson><FirstName>Jackie</FirstName><sex>Female</sex></Jackson><Smith><FirstName>Mary</FirstName><sex>Female</sex></Smith></Students><Class><Subject>Politics</Subject><Room>null</Room><Semester>Summer</Semester><Notes>We're happy, you happy?</Notes></Class><Grades><Test><LIST_ELEMENT_Test><points>15</points><grade>C</grade></LIST_ELEMENT_Test><LIST_ELEMENT_Test><points>55</points><grade>A</grade></LIST_ELEMENT_Test><LIST_ELEMENT_Test><points>65</points><grade>A</grade></LIST_ELEMENT_Test></Test></Grades><teacher><age>35</age><name>Mr Borat</name><Nationality>Kazakhstan</Nationality></teacher></ROOT>

【讨论】:

【参考方案8】:

StAXON 可以使用带有默认模板的 XSLT 或 StAX 事件 API 将 JSON 转换为 XML https://github.com/beckchr/staxon/wiki/Converting-JSON-to-XML

这是一个简单的例子:

输入文件:


    "container":[
        
            "someString":"xxxxx",
            "someInteger":123,
            "someArrayElem":[
                
                    "key":1111,
                    "value":"One"
                ,
                
                    "key":2222,
                    "value":"Two"
                
            ]
        
    ]

进口+代码:

import de.odysseus.staxon.json.JsonXMLConfig;
import de.odysseus.staxon.json.JsonXMLConfigBuilder;
import de.odysseus.staxon.json.JsonXMLInputFactory;
import de.odysseus.staxon.xml.util.PrettyXMLEventWriter;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLOutputFactory;
import java.io.StringWriter;

StringWriter stringWriter = new StringWriter();
JsonXMLConfig config = new JsonXMLConfigBuilder().multiplePI(false).prettyPrint(false).build();
XMLEventReader reader = new JsonXMLInputFactory(config).createXMLEventReader(getClass().getClassLoader().getResourceAsStream("input.json"));
XMLEventWriter writer = XMLOutputFactory.newInstance().createXMLEventWriter(stringWriter);
writer = new PrettyXMLEventWriter(writer);
writer.add(reader);
String xml = stringWriter.getBuffer().toString();

输出:

<?xml version="1.0" encoding="UTF-8"?>
<container>
    <someString>xxxxx</someString>
    <someInteger>123</someInteger>
    <someArrayElem>
        <key>1111</key>
        <value>One</value>
    </someArrayElem>
    <someArrayElem>
        <key>2222</key>
        <value>Two</value>
    </someArrayElem>
</container>

【讨论】:

【参考方案9】:

您可以使用json-lib,它提供双向转换。

【讨论】:

以上是关于JSON到XML转换的Java实现[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 实现XML与JSON 相互转换

工具类|java实现Json和XML相互转换

xml和JSON格式相互转换的Java实现

JAXB实现java对象与xml之间转换

jackson中objectMapper的使用

java 怎么将 map xml 相互转换