XML 到 JSON 的动态转换

Posted

技术标签:

【中文标题】XML 到 JSON 的动态转换【英文标题】:Dynamic Conversion of XML to JSON 【发布时间】:2012-01-12 03:38:50 【问题描述】:

是否有任何方法(如果可能,使用 Java 代码示例)在不了解 XML 源(文件、字符串等)?

例如,假设一个具有未知结构和多个嵌套级别的非常大的 XML 数据集存储在一个大文本文件中。将所有内容读入内存是不可能的(因为空间不足),他们想直接将其转换为JSON,即,无需编写任何代码来检测和处理StAX标签(例如,START_ELEMENTCHARACTERS , END_ELEMENT)。

理想的解决方案是从转换器获取ReaderInputStream,例如,提供XML 文件,ReaderInputStream 生成JSON,以供输入到 FileOutputStream,甚至直接到 JSON 解析器,如 Jackson。如果这是不可能的,那么至少一种渐进式读取 XML 文件、转换为 JSON 并写入另一个文件的方法是可以接受的折衷方案。

可用于从/转换为 XML/JSON 的工具(例如,StaxON、JSON-lib、Jettison、XStream)似乎不能这样做,而只能转换已知结构。

编辑: 从 OutputStream 或 Writer 获取 ReaderInputStream(这也包括我上面提到的“转换”),可以通过多种方式完成,尽管为了获得最佳结果和“无限”输入大小,涉及到多线程。在article in Ostermiller.org 中描述了解决方案,在IO-Tools library 中可以找到类似的实现。

【问题讨论】:

【参考方案1】:

这是一个简单的例子,它使用 Java 的内置 StAX 实现到 parse XML 和 Jettison 到 produce JSON。 XMLEventWriter 有一个方便的 add(XMLEventWriter) 方法,可以将读者与作者联系起来,让这变得超级简单:

import org.codehaus.jettison.mapped.MappedXMLOutputFactory;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLInputFactory;
import java.io.StringReader;
import java.util.HashMap;

public class Main 
    public static void main(String[] args) throws Exception 
        String xml =
            "<root><foo>foo string</foo><bar><x>1</x><y>5</y></bar></root>";
        XMLEventReader reader = XMLInputFactory.newInstance()
            .createXMLEventReader(new StringReader(xml));
        XMLEventWriter writer = new MappedXMLOutputFactory(new HashMap())
            .createXMLEventWriter(System.out);
        writer.add(reader);
        writer.close();
        reader.close();
    

我创建了一个独立的 Maven 项目来演示这个 on Github。

【讨论】:

这提供了“写入文件”(或标准输出)的解决方案。感谢您的回答和额外的努力! 你如何忽略评论标签?当xml中有注释标签时,XMLEventWriter会抛出异常。 @ShaggyInjun:这应该是它自己的问题,并附有示例代码,而不是对 1.5 年前的答案的评论。 感谢您的回复,我在发布此消息之前创建了一个问题,因为我想您会这么说。任何帮助表示赞赏。 ***.com/questions/16428574/… 首先在 xmlns="..." 上获得 IllegalStateException。二、去掉xmlns后,得到java.lang.ClassCastException: java.lang.String cannot be cast to org.codehaus.jettison.json.JSONObject【参考方案2】:

您可以使用 StAXON 执行此操作,请参阅 https://github.com/beckchr/staxon/wiki/Converting-XML-to-JSON 以获取示例代码。

【讨论】:

显然您可以写入文件,但没有直接的方法将 JSON 输出“管道”到阅读器或 InputStream。谢谢。【参考方案3】:

underscore-java 库包含静态方法 fromXml 和 toJson。我是项目的维护者。

代码示例:

import com.github.underscore.lodash.U;
import java.util.Map;
import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class StringTest 

    @Test
    public void toJsonFromXml() 
        final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n"
            + "  <FirstItem>1</FirstItem>\n  <SecondItem>2</SecondItem>\n</root>";
        assertEquals("\n"
            + "  \"root\": \n"
            + "    \"FirstItem\": \"1\",\n"
            + "    \"SecondItem\": \"2\"\n"
            + "  \n"
            + "",
            U.toJson((Map<String, Object>) U.fromXml(xml)));
    

【讨论】:

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

挂钩 OData 的 $metadata 响应并将其从 XML 转换为 JSON

动态访问嵌套对象

将动态json模型转换为c#对象[重复]

创建PHP动态多字段的JSON格式

动态JSON转换Object

如何在 C# 中动态转换来自 Json.NET 的解析 JSON 结果?