将JSON转换为XML的Java实现

21

是否有现成的JAR文件可以将JSON转换为XML?


Underscore-java库有一个静态方法U.jsonToXml(json)。它是一个单独的jar文件。Java 8、11和17的版本都可用。 - Valentyn Kolesnikov
9个回答

26
你可以创建一个JSONObject,然后使用org.json命名空间中的XML类将其转换为XML。
将json字符串包装到对象中就像在构造函数中传递它一样容易。
JSONObject o = new JSONObject(jsonString);

然后,您可以使用XML类以XML格式获取它,就像这样:
String xml = org.json.XML.toString(o);

6
太简单了,谢谢! - Jon
请问您能否详细说明一下?我的意思是,我是否需要使用外部JAR包?Eclipse无法识别这些命令。 - Ankit Srivastava
你可以尝试这个:http://mvnrepository.com/artifact/org.codeartisans/org.json/20130603 - Browny Lin
1
@AnkitSrivastava,类JSONObjectXML的源Java文件可以从https://github.com/douglascrockford/JSON-java(json.org/java)下载。但是您仍然需要自己制作jar包。但是,如果您正在使用Google App Engine,则可以在com.google.appengine.labs.repackaged.org.json.*中找到类JSONObject和XML。 - Abel Callejo
JSONObject jsonObject = new JSONObject(json.toString())...这行代码会抛出一个错误,指出“没有找到适合的JSONObject(String)构造函数”。 - Paras Singh

14

虽然不是Java,但它是一个纯XSLT 2.0实现:

看看f:json-document()FXSL 2.x库

使用此函数可以非常容易地将JSon合并,并像XML一样使用它。

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

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

并且获取所有Students的子元素,其中sex = 'Female'

这是完整的示例:

<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论坛上发布了这个问题:https://sourceforge.net/forum/message.php?msg_id=7385342 - avernet
这里有一个如何使用该函数的示例。它位于Tests文件夹中的testFunc-json-document.xsl文件中:http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/Tests/testFunc-json-document.xsl?revision=1.1&view=markup当应用于任何XML文件(未使用)时,此转换会产生正确的结果。可能导致您的问题的一个潜在因素是使用相对较旧版本的Saxon - 请使用Saxon 9.x版本。此外,您消息中的链接无法访问。 - Dimitre Novatchev

3

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

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

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


2

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

  • 上述关于没有完全可靠的一对一映射的观点是正确的,但我使用上述库将xml转换为json的经验非常好。

2

1

转化框!!!

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

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>

1

0
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>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接