XML 到 JSON 的动态转换
Posted
技术标签:
【中文标题】XML 到 JSON 的动态转换【英文标题】:Dynamic Conversion of XML to JSON 【发布时间】:2012-01-12 03:38:50 【问题描述】:是否有任何方法(如果可能,使用 Java 代码示例)在不了解 XML 源(文件、字符串等)?
例如,假设一个具有未知结构和多个嵌套级别的非常大的 XML 数据集存储在一个大文本文件中。将所有内容读入内存是不可能的(因为空间不足),他们想直接将其转换为JSON
,即,无需编写任何代码来检测和处理StAX标签(例如,START_ELEMENT
、CHARACTERS
, END_ELEMENT
)。
理想的解决方案是从转换器获取Reader
或InputStream
,例如,提供XML 文件,Reader
或InputStream
生成JSON
,以供输入到 FileOutputStream,甚至直接到 JSON
解析器,如 Jackson
。如果这是不可能的,那么至少一种渐进式读取 XML 文件、转换为 JSON 并写入另一个文件的方法是可以接受的折衷方案。
可用于从/转换为 XML/JSON 的工具(例如,StaxON、JSON-lib、Jettison、XStream)似乎不能这样做,而只能转换已知结构。
编辑: 从 OutputStream 或 Writer 获取 Reader
或 InputStream
(这也包括我上面提到的“转换”),可以通过多种方式完成,尽管为了获得最佳结果和“无限”输入大小,涉及到多线程。在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 的动态转换的主要内容,如果未能解决你的问题,请参考以下文章