簡體   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