【发布时间】:2010-10-08 05:46:57
【问题描述】:
是否有现有的 JAR 可用于从 JSON 转换为 XML?
【问题讨论】:
-
Underscore-java 库有静态方法 U.jsonToXml(json)。它是一个 jar 文件。有适用于 java 6、8 和 11 的版本。我是项目的维护者。
标签: java xml json translation
是否有现有的 JAR 可用于从 JSON 转换为 XML?
【问题讨论】:
标签: java xml json translation
您可以创建一个JSONObject,然后使用 org.json 命名空间中的XML class 将其转换为 XML
在对象中包装 json 字符串就像在其构造函数中传递它一样简单
JSONObject o = new JSONObject(jsonString);
然后您可以使用 XML 类以 XML 格式获取它,如下所示:
String xml = org.json.XML.toString(o);
【讨论】:
com.google.appengine.labs.repackaged.org.json.* 中找到 JSONObject 和 XML 类
不是 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>
【讨论】:
另一种可能性:Jettison,http://jettison.codehaus.org 可以通过 XML 解析接口 (stax XMLStreamReader) 公开 Json,这允许与只理解 XML 的系统集成。它需要使用约定(badgerfish 或其他任何名称)。
例如,XStream 使用 Jettison(或至少是 Badgerfish 约定)来允许使用 JSON。
但问题本身有点模糊:虽然您总是可以从一个转换为另一个(这确实是一件非常微不足道的事情),但 XML 和 JSON 并不等价:没有一对一的无损通用映射。 因此,问题是:您打算如何处理结果,如何使用生成的 xml?
【讨论】:
http://json-lib.sourceforge.net/
【讨论】:
您可能想尝试 XStream。看看http://x-stream.github.io/faq.html#JSON。
【讨论】:
你可以试试https://github.com/lukas-krecan/json2xml,它提供了简单的 JSON 到 XML 的转换。它采用 Jackson JSON 解析器并使用它来发出 SAX 事件。
【讨论】:
我正在使用 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>
【讨论】:
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>
【讨论】:
您可以使用json-lib,它提供双向转换。
【讨论】: