将XML转换为JSON格式

时间:2011-02-25 04:44:56

标签: java xml json docx

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

10 个答案:

答案 0 :(得分:13)

您可以查看提供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 );  

如果您还需要root标签,只需添加一个外部虚拟标签:

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

答案 1 :(得分:10)

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格式将很难解决。

答案 2 :(得分:6)

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

您必须调用静态toJSONObject method

  

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

答案 3 :(得分:6)

如果您对各种实现不满意,请尝试自己动手。这是我今天下午写的一些代码,以帮助您入门。它适用于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;
    }
}

答案 4 :(得分:4)

如果您需要能够在将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() XStream会生成JSON,因为使用了Jettison驱动程序。

答案 5 :(得分:4)

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

<强> Docx4j

我之前使用过docx4j,值得一看。

<强> unXml

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

它是轻量级的,并且有一个简单的语法从xml中选择XPath,并在Jackson ObjectNode中将它们作为Json属性返回。

答案 9 :(得分:0)

使用 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);