web-dev-qa-db-ja.com

XMLをJSON形式に変換する

Docxファイル形式(openXML形式)をJSON形式に変換する必要があります。それにはいくつかのガイドラインが必要です。前もって感謝します。

19
vignesh

XML-to-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>");  
13
Tommy Siu

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形式を自分で手動で定義するのは困難です。

10
Jacob

Org.json名前空間の XMLクラス は、この機能を提供します。

Static toJSONObject method を呼び出す必要があります

整形式の(必ずしも有効ではない)XML文字列をJSONObjectに変換します。 JSONはデータ形式であり、XMLはドキュメント形式であるため、この変換では一部の情報が失われる可能性があります。 XMLは要素、属性、およびコンテンツテキストを使用し、JSONは名前/値のペアと値の配列の順不同のコレクションを使用します。 JSONは、要素と属性を区別することを好みません。同様の要素のシーケンスは、JSONArrayとして表されます。コンテンツテキストは、「コンテンツ」メンバーに配置できます。コメント、プロローグ、DTD、および<[[]]>は無視されます。

6
juan

さまざまな実装に満足できない場合は、独自の実装を試してください。以下に、今日の午後に作成したコードを示します。 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;
    }
}
6
Fred Haslam

XMLをJSONに変換する前にXMLを操作できるようにする必要がある場合、または表現をきめ細かく制御する必要がある場合は、XStreamを使用します。 xml-to-object、json-to-object、object-to-xml、およびobject-to-json間の変換は非常に簡単です。 XStreamのドキュメント の例を次に示します。

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を生成します。

4
Yuriy Nemtsov

Docxはドキュメント中心のXML形式であり、JSONはデータ中心の形式であるため、完全なdocxファイルをJSONに変換することはお勧めできません。 XMLは一般に、ドキュメント中心とデータ中心の両方になるように設計されています。ドキュメント中心のXMLをJSONに変換することは技術的には可能ですが、生成されたデータの処理は非常に複雑になる場合があります。実際に必要なデータに焦点を合わせ、その部分のみを変換してください。

4
Andreas

Xmlスニペットの有効なdtdファイルがある場合、オープンソースEclipseリンクjarを使用して、xmlをjsonに、jsonをxmlに簡単に変換できます。詳細なサンプルJavaプロジェクトはここにあります: http://www.cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format。 html

1
Piyush Chordia

私はチュートリアルに出くわしました、それがあなたを助けることを望みます。 http://www.techrecite.com/xml-to-json-data-parser-converter

0
Jeson

Docx4j

以前に docx4j を使用したことがあるので、見てみる価値があります。

unXml

また、オープンソース nXml -- Maven Central で利用可能なライブラリをチェックアウトすることもできます。

軽量で、xmlからXPathを選択し、 JacksonObjectNodeのJson属性としてそれらを返す簡単な構文を持っています。

0
tomaj

使用する 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);
0
JK s