转换XML到JSON格式
有XML和JSON之间没有直接的映射; XML带有类型信息(每个元素都有一个名称)以及命名空间。因此,除非每个JSON对象都嵌入了类型信息,否则转换将是有损的。
但是,这并不必然关系。重要的是JSON的消费者知道数据合同。例如,鉴于此XML:
<books>
<book author="Jimbo Jones" title="Bar Baz">
<summary>Foo</summary>
</book>
<book title="Don't Care" author="Fake Person">
<summary>Dummy Data</summary>
</book>
</books>
你可以将其转换为这样的:
{
"books": [
{ "author": "Jimbo Jones", "title": "Bar Baz", "summary": "Foo" },
{ "author": "Fake Person", "title": "Don't Care", "summary": "Dummy Data" },
]
}
而且消费者不需要知道该books
集合中的每个对象是一个book
对象。
编辑:
如果您对XML的XML Schema和使用.NET是,你可以生成类使用XSD.EXE架构。然后,您可以将源XML解析为这些类的对象,然后使用DataContractJsonSerializer
将这些类序列化为JSON。
如果你没有一个模式,这将是很难让周围手动定义自己的JSON格式。
你可以看看的Json-lib Java库,它提供XML到JSON的转换。
String xml = "<hello><test>1.2</test><test2>123</test2></hello>";
XMLSerializer xmlSerializer = new XMLSerializer();
JSON json = xmlSerializer.read(xml);
如果你需要根标签太多,只需添加一个外部伪标签:
String xml = "<hello><test>1.2</test><test2>123</test2></hello>";
XMLSerializer xmlSerializer = new XMLSerializer();
JSON json = xmlSerializer.read("<x>" + xml + "</x>");
这将是很好的,但结果是'{ “测试”: “1.2”, “TEST2”: “123”}'和不'{ “你好”:{ “测试”: “1.2”, “TEST2”: “123”}}',就是只打印叶子(''标签丢失)。如果我们添加一个中间节点(''的子节点和'
如果您需要能够操纵你的XML,然后才会慢慢转化为JSON,或想细用XStream进行粒度控制。在xml-to-object,json-to-object,object-to-xml和object-to-json之间进行转换非常简单。下面是XStream's docs一个例子:
XML:
<person>
<firstname>Joe</firstname>
<lastname>Walnes</lastname>
<phone>
<code>123</code>
<number>1234-456</number>
</phone>
<fax>
<code>123</code>
<number>9999-999</number>
</fax>
</person>
POJO(DTO):
public class Person {
private String firstname;
private String lastname;
private PhoneNumber phone;
private PhoneNumber fax;
// ... constructors and methods
}
从XML转换为POJO:
String xml = "<person>...</person>";
XStream xstream = new XStream();
Person person = (Person)xstream.fromXML(xml);
然后从POJO到JSON :
XStream xstream = new XStream(new JettisonMappedXmlDriver());
String json = xstream.toXML(person);
注:尽管方法读取toXML()
由于使用了Jettison驱动程序,因此XStream将生成JSON。
转换完成docx文件成JSON看起来并不像一个好主意,因为DOCX是一个文档为中心的XML格式和JSON是一个以数据为中心的格式。一般而言,XML旨在兼顾文档和数据。虽然技术上可能将以文档为中心的XML转换为JSON,但处理生成的数据可能过于复杂。尝试专注于实际需要的数据并仅转换该部分。
org.json命名空间中的XML class为您提供了此功能。
你必须调用静态toJSONObject method
合式(但不一定有效)的XML字符串转换成一个JSONObject。由于JSON是一种数据格式,XML是一种文档格式,因此在这种转换中可能会丢失一些信息。 XML使用元素,属性和内容文本,而JSON使用名称/值对和值数组的无序集合。 JSON并不喜欢区分元素和属性。类似元素的序列表示为JSONArrays。内容文本可以放在“内容”成员中。评论,序言,DTD和< [[]]>将被忽略。
这绝对是最简单和最干净的方法。谢谢。 – 2012-12-28 15:58:14
我试图使用它,但它创建了基于xml的Node/text。如何创建基于属性的XML?例如:如果我的JSON数据是: {订单:{订单行:{的ItemID: “1234”}},OrderNo: “4567”} Reqrd O/P: 这是基于节点的。我正在查看属性基础xml转换。请告诉我,如果您有任何建议。 – Aki 2013-01-27 15:08:02
如果您不满意的各种实现方式,尝试滚动自己。下面是我今天下午为了让你开始写的一些代码。它的工作原理与net.sf.json和Apache共郎咸平:
static public JSONObject readToJSON(InputStream stream) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser parser = factory.newSAXParser();
SAXJsonParser handler = new SAXJsonParser();
parser.parse(stream, handler);
return handler.getJson();
}
而且SAXJsonParser实现:
package xml2json;
import net.sf.json.*;
import org.apache.commons.lang.StringUtils;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;
import java.util.List;
public class SAXJsonParser extends DefaultHandler {
static final String TEXTKEY = "_text";
JSONObject result;
List<JSONObject> stack;
public SAXJsonParser(){}
public JSONObject getJson(){return result;}
public String attributeName(String name){return "@"+name;}
public void startDocument() throws SAXException {
stack = new ArrayList<JSONObject>();
stack.add(0,new JSONObject());
}
public void endDocument() throws SAXException {result = stack.remove(0);}
public void startElement (String uri, String localName,String qName, Attributes attributes) throws SAXException {
JSONObject work = new JSONObject();
for (int ix=0;ix<attributes.getLength();ix++)
work.put(attributeName(attributes.getLocalName(ix)), attributes.getValue(ix));
stack.add(0,work);
}
public void endElement (String uri, String localName, String qName) throws SAXException {
JSONObject pop = stack.remove(0); // examine stack
Object stashable = pop;
if (pop.containsKey(TEXTKEY)) {
String value = pop.getString(TEXTKEY).trim();
if (pop.keySet().size()==1) stashable = value; // single value
else if (StringUtils.isBlank(value)) pop.remove(TEXTKEY);
}
JSONObject parent = stack.get(0);
if (!parent.containsKey(localName)) { // add new object
parent.put(localName, stashable);
}
else { // aggregate into arrays
Object work = parent.get(localName);
if (work instanceof JSONArray) {
((JSONArray)work).add(stashable);
}
else {
parent.put(localName,new JSONArray());
parent.getJSONArray(localName).add(work);
parent.getJSONArray(localName).add(stashable);
}
}
}
public void characters (char ch[], int start, int length) throws SAXException {
JSONObject work = stack.get(0); // aggregate characters
String value = (work.containsKey(TEXTKEY) ? work.getString(TEXTKEY) : "");
work.put(TEXTKEY, value+new String(ch,start,length));
}
public void warning (SAXParseException e) throws SAXException {
System.out.println("warning e=" + e.getMessage());
}
public void error (SAXParseException e) throws SAXException {
System.err.println("error e=" + e.getMessage());
}
public void fatalError (SAXParseException e) throws SAXException {
System.err.println("fatalError e=" + e.getMessage());
throw e;
}
}
Docx4j
我以前用过docx4j,这是值得考虑看看。
unXml
您还可以看看我的开源unXml -library上可用Maven Central。
它轻量级,并有一个简单的语法从XML中挑出XPath,并让它们返回为JacksonObjectNode
中的Json属性。
如果你有一个有效的XML片段的dtd文件,那么你可以很容易地使用开源的Eclipse链接jar将xml转换为json和json到xml。详细示例Java项目可以在这里找到:http://cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html
如何进行这种转换。该输入XML有些复杂,所以转换必须易于并具有良好的performance..Which语言者优先做到这一点? – vignesh 2011-02-25 05:00:01
这正是[XML-ValidatorBuddy(http://www.xml-tools.com/ValidatorBuddy.htm)可以 – Fluffi1974 2012-07-15 13:22:34
你做雅各, 我用您的代码示例,并已成功转换的XML文件到一个JSON对象。但是,我的XML文件表示一个根元素()和一个分组元素(),其中所有其他元素都是嵌套的。该元素是什么,我以后,它可以包含属性,儿童和盛大子元素的任何变化等 有我来回报每元素的ArrayList 的方式。换句话说,我可以指定类似于XPath的东西,但仍然使用SAX? P.S:由于大小限制,我无法使用DOM。 –
2016-11-11 00:07:34