繁体   English   中英

将 XML 转换为 JSON 格式

[英]Convert XML to JSON format

我必须将 docx 文件格式(采用 openXML 格式)转换为 JSON 格式。 我需要一些指导方针来做到这一点。 提前致谢。

您可以查看提供 XML 到 JSON 转换的Json-lib Java 库。

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>");  

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 架构并且正在使用 .NET,则可以使用 xsd.exe 从架构生成类。 然后,您可以将源 XML 解析为这些类的对象,然后使用DataContractJsonSerializer将类序列化为 JSON。

如果您没有架构,则很难自己手动定义 JSON 格式。

org.json 命名空间中的XML 类为您提供了此功能。

您必须调用静态toJSONObject 方法

将格式正确(但不一定有效)的 XML 字符串转换为 JSONObject。 由于 JSON 是一种数据格式而 XML 是一种文档格式,因此在此转换中可能会丢失一些信息。 XML 使用元素、属性和内容文本,而 JSON 使用名称/值对和值数组的无序集合。 JSON 不喜欢区分元素和属性。 相似元素的序列表示为 JSONArrays。 内容文本可以放置在“内容”成员中。 注释、序言、DTD 和 <[ [ ]]> 将被忽略。

如果您对各种实现不满意,请尝试滚动您自己的实现。 这是我今天下午编写的一些代码,可以帮助您入门。 它适用于 net.sf.json 和 apache common-lang:

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;
    }
}

如果您需要能够在将 XML 转换为 JSON 之前对其进行操作,或者希望对您的表示进行细粒度控制,请使用 XStream。 在以下之间转换非常容易:xml-to-object、json-to-object、object-to-xml 和 object-to-json。 这是XStream 文档中的一个示例:

XML
String xml = "<person>...</person>";
XStream xstream = new XStream();
Person person = (Person)xstream.fromXML(xml);
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() XStream 将产生 JSON,因为使用了 Jettison 驱动程序。

将完整的 docx 文件转换为 JSON 看起来不是一个好主意,因为 docx 是一种以文档为中心的 XML 格式,而 JSON 是一种以数据为中心的格式。 XML 通常被设计为以文档和数据为中心。 尽管以文档为中心的 XML 转换为 JSON 在技术上是可行的,但处理生成的数据可能过于复杂。 尝试专注于实际需要的数据并仅转换该部分。

如果您有 xml 片段的有效 dtd 文件,那么您可以使用开源 eclipse 链接 jar 轻松地将 xml 转换为 json 并将 json 转换为 xml。 可以在这里找到详细的示例 JAVA 项目: http : //www.cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html

我遇到了一个教程,希望对你有帮助。 http://www.techrecite.com/xml-to-json-data-parser-converter

Docx4j

之前用过docx4j ,值得一看。

非XML

您还可以查看我在Maven Central上提供的开源unXml -library。

它是轻量级的,并且具有简单的语法,可以从您的 xml 中挑选出 XPath,并将它们作为 Json 属性返回到Jackson ObjectNode

xmlSerializer.setForceTopLevelObject(true)

在结果 JSON 中包含根元素。

你的代码是这样的

String xml = "<hello><test>1.2</test><test2>123</test2></hello>";
XMLSerializer xmlSerializer = new XMLSerializer();
xmlSerializer.setForceTopLevelObject(true);
JSON json = xmlSerializer.read(xml);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM