将 XML 转换为 JSON 格式

Posted

技术标签:

【中文标题】将 XML 转换为 JSON 格式【英文标题】:Convert XML to JSON format 【发布时间】:2011-07-04 01:52:14 【问题描述】:

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

【问题讨论】:

考虑使用simplify-docx Underscore-java库有一个静态方法U.xmlToJson(xml)。 【参考方案1】:

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

【讨论】:

这会很好,但结果是"test":"1.2","test2":"123" 而不是"hello":"test":"1.2","test2":"123",也就是说它只打印叶子(&lt;hello&gt; 标签丢失)。如果我们添加一个中间节点(&lt;hello&gt; 的儿子和&lt;test&gt; 的父节点),也会发生同样的情况:它将被忽略。是配置问题吗? 在这种情况下,我们有像 <...>[2] jsfnek [5]<....> 这样的 XML 参数,但在我的 json 中,我们只得到 [2] 第一个值,你可以请帮助我理解为什么完整的价值不可读【参考方案2】:

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 格式。

【讨论】:

如何进行这种转换.. 输入的 xml 有点复杂,所以转换必须简单且性能良好.. 首选哪种语言? 这正是XML-ValidatorBuddy能为你做的事 Jacob,我正在使用您的代码示例,并且已成功将 XML 文件转换为 JSON 对象。但是,我的 XML 文件表示一个根元素 () 和一个分组元素 (),其中嵌套了所有其他 元素。 元素是我所追求的,它可能包含属性、子元素和孙子元素等的任何变体。有没有办法让我返回每个 元素的 ArrayList。换句话说,我可以指定类似于 XPath 的东西并仍然使用 SAX 吗? P.S:由于大小限制,我不能使用 DOM。 您的意思是在另一个答案上发布此内容吗?我没有任何代码示例。【参考方案3】:

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

你必须调用静态toJSONObject method

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

【讨论】:

这绝对是最简单最干净的方法。谢谢。 我试图使用它,但它创建了基于节点/文本的 xml。如何创建基于属性的xml?例如:如果我的 JSON 数据是:Order:OrderLine:ItemID:"1234",OrderNo:"4567" Reqrd O/P: 是基于节点的。我正在查看属性基础 xml 转换。如果您有任何建议,请告诉我。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

如果您需要能够在 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 驱动程序。

【讨论】:

【参考方案7】:

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

【讨论】:

链接已修复。【参考方案8】:

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

【讨论】:

你链接到的例子是php;该问题已标记为 Java。 而且网站现在已经被删除了,这个答案也应该是这样的。【参考方案9】:

使用

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

【讨论】:

【参考方案10】:

Docx4j

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

unXml

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

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

【讨论】:

以上是关于将 XML 转换为 JSON 格式的主要内容,如果未能解决你的问题,请参考以下文章

Azure APIM:将 JSON 响应转换为自定义 XML 格式

xml转换为json格式时,如何将指定节点转换成数组 Json.NET

如何将 JSON 数据转换为 XML 格式数据并在 React JS 中下载文件

python:将xml格式文件转换成json格式文件

接口测试xml格式转换成json

怎么将json文件转成xml文件