JSON 到 XML 转换的 Java 实现
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/559296/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Java implementation of JSON to XML conversion
提问by dacracot
Are there existing JARs available to convert from JSON to XML?
是否有现有的 JAR 可用于从 JSON 转换为 XML?
采纳答案by Dimitre Novatchev
Not a Java, but a pure XSLT 2.0 implementation:
不是 Java,而是纯 XSLT 2.0 实现:
Have a look at the f:json-document()
from the FXSL 2.x library.
查看f:json-document()
来自FXSL 2.x 库的。
Using this function it is extremely easy to incorporate JSon and use it just as... XML.
使用此功能可以非常容易地合并 JSon 并将其用作... XML。
For example, one can just write the following XPath expression:
例如,可以只编写以下 XPath 表达式:
f:json-document($vstrParam)/Students/*[sex = 'Female']
and get all children of Students
with sex = 'Female'
并让所有的孩子Students
用sex = 'Female'
Here is the complete example:
这是完整的示例:
<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"},
"Hymanson":
{"First Name":"Hymanie","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>
When the above transformation is applied on any XML document (ignored), the correct result is produced:
当上述转换应用于任何 XML 文档(忽略)时,会产生正确的结果:
<Smith>
<First_Name>Mary</First_Name>
<sex>Female</sex>
</Smith>
<Hymanson>
<First_Name>Hymanie</First_Name>
<sex>Female</sex>
</Hymanson>
回答by Antonio
You may want to try XStream. Take a look at http://x-stream.github.io/faq.html#JSON.
您可能想尝试 XStream。看看http://x-stream.github.io/faq.html#JSON。
回答by Bhushan Bhangale
回答by StaxMan
One more possibility: Jettison, http://jettison.codehaus.orgcan expose Json via XML parsing interface (stax XMLStreamReader), which allows integration with systems that only understand XML. It requires use of a convention (badgerfish, or whatever the other one was called).
另一种可能性:Jettison,http://jettison.codehaus.org可以通过 XML 解析接口 (stax XMLStreamReader) 公开 Json,这允许与仅理解 XML 的系统集成。它需要使用一个约定(獾,或其他任何被称为的约定)。
XStream, for example, uses Jettison (or at least Badgerfish convention) to allow use of JSON.
例如,XStream 使用 Jettison(或至少是 Badgerfish 约定)来允许使用 JSON。
But the question itself is bit vague: while you can always convert from one to the othe (it is a very trivial thing to do really), XML and JSON are not equivalent: there is no one-to-one lossless generic mapping. Hence, the question is: what are you planning to do with results, how is resulting xml to be used?
但问题本身有点含糊:虽然您总是可以从一个转换为另一个(这实际上是一件非常微不足道的事情),但 XML 和 JSON 并不等效:没有一对一的无损通用映射。因此,问题是:您打算如何处理结果,如何使用结果 xml?
回答by okredo
http://json-lib.sourceforge.net/
http://json-lib.sourceforge.net/
- the points above about no completely foolproof one-one mapping are valid, but I have had a good experience with converting xml to json using the above library.
- 上面关于没有完全万无一失的一对一映射的观点是有效的,但是我在使用上述库将 xml 转换为 json 方面有很好的经验。
回答by juan
You can create a JSONObject, and then convert it to XML using the XML classin the org.json namespace
您可以创建一个JSONObject,然后使用org.json 命名空间中的XML 类将其转换为 XML
Wrapping the json string in the object is as easy as passing it in its constructor
将 json 字符串包装在对象中就像在其构造函数中传递它一样简单
JSONObject o = new JSONObject(jsonString);
Then you can get it in XML format using the XML class, like so:
然后您可以使用 XML 类以 XML 格式获取它,如下所示:
String xml = org.json.XML.toString(o);
回答by Lukas
You can try https://github.com/lukas-krecan/json2xmlthat provides simple JSON to XML conversion. It takes Hymanson JSON parser and usees it to emit SAX events.
您可以尝试提供简单的 JSON 到 XML 转换的https://github.com/lukas-krecan/json2xml。它使用 Hymanson JSON 解析器并使用它来发出 SAX 事件。
回答by Mark
StAXON can convert JSON to XML using either XSLT with default templates or StAX event API https://github.com/beckchr/staxon/wiki/Converting-JSON-to-XML
StAXON 可以使用带有默认模板的 XSLT 或 StAX 事件 API https://github.com/beckchr/staxon/wiki/Converting-JSON-to-XML将 JSON 转换为 XML
Here's a simple example:
这是一个简单的例子:
INPUT FILE:
输入文件:
{
"container":[
{
"someString":"xxxxx",
"someInteger":123,
"someArrayElem":[
{
"key":1111,
"value":"One"
},
{
"key":2222,
"value":"Two"
}
]
}
]
}
Imports + code:
进口+代码:
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();
OUTPUT:
输出:
<?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>
回答by Dominic Gomes
I am using the JSON that Dimitre has pasted in his reply and have converted into an XML. Lets see if it works for you .....
我正在使用 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\"},\"Hymanson\":{\"FirstName\":\"Hymanie\",\"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();
}
}
}
Output:
输出:
JSON: {"ROOT":{"Students":{"Brown":{"FirstName":"John","sex":"Male"},"Hymanson":{"FirstName":"Hymanie","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><Hymanson><FirstName>Hymanie</FirstName><sex>Female</sex></Hymanson><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>