是否有一个 SaxParser 可以读取 json 并触发事件,所以它看起来像 xml

Posted

技术标签:

【中文标题】是否有一个 SaxParser 可以读取 json 并触发事件,所以它看起来像 xml【英文标题】:Is there a SaxParser that reads json and fires events so it looks like xml 【发布时间】:2011-05-21 08:51:36 【问题描述】:

这会很棒,因为除了不同的 sax 解析器之外,它可以让我的 xml 内容读取 json 而无需任何更改。

【问题讨论】:

你为什么想要那个。 json的重点是不要像xml那样解析它。 对我来说似乎是一个合理的要求。 (@Falmarri - 如果 JSON 的唯一要点不是像 XML 那样被解析,那将是一个关于 JSON 的可悲声明。)但是 XML 和 JSON 在结构上足够不同,我真的怀疑你是否可以 100% 地兼容代码来使用 XML使用 JSON 时的面向 SAX 处理代码。但在简单的情况下,您可能已经足够接近了。 Xml 和 Json 都有属性和子级。它们非常相似,只是它们的符号不同。两者都拥有 0 个或多个孩子,依此类推。 json 对象的属性可以看作 xml 属性等。 我必须同意 Falmarri,JSON != XML,如果没有其他方法,只能将仿真作为最后的努力。然而,也许最初的提问者想要一些像 sax API,而不是 SAX API 的东西——SAX API 没有意义,因为它是特定于 xml 的;但推式方法是通用的。但这一切都取决于问题是专门针对 SAX(XML 的简单 api,非常特定于 xml),还是针对更通用的流/增量解析方法。 有很多用例。如果您正在使用 Perl,则可以轻松地将 JSON 字符串转换为您可以轻松操作的深层结构,但使用 Java 则不然。最接近的 Java 具有一个可以像 Perl 哈希一样操作和访问的简单层次结构是 W3C DOM 对象(我不认为 Map 是一个合适的替代方案)。因此,使用 SAX 处理程序解析 JSON 的能力为您提供了一种从 Java 中的 JSON 结构构建 DOM 树的简单机制。除此之外,能够像处理 XML 一样处理 JSON 让您可以访问大量其他与 XML 相关的工具,例如 XSLT 【参考方案1】:

如果您的意思是基于事件的解析器,那么有几个项目可以做到这一点:

    http://code.google.com/p/json-simple/

    类似 SAX 的可停止接口,用于 JSON 文本的流式输入

    此项目已移至https://github.com/fangyidong/json-simple

    http://jackson.codehaus.org/Tutorial

    Jackson Streaming API 类似于 Stax API

    此项目已移至https://github.com/FasterXML/jackson-core

【讨论】:

好点;也许它不是 SAX,而是 SAX 风格(增量处理,而不是树模型)【参考方案2】:

我认为尝试将 JSON 视为 XML 是一个坏主意(这实际上是您要问的);但是,Jettison 就是这样做的。它通过 Stax API (javax.xml.stream) 公开 JSON 内容。如果你真的想要 SAX,从 Stax 到 SAX 编写包装器也是微不足道的(但不是相反)。

我还认为,除了希望使用的机制之外,如果您多解释一下您想要实现的目标,您可能会得到更好的答案。例如,有很多 XML 和 JSON 的数据绑定工具;并且使用此类工具可以更好地隐藏较低级别的细节,而不是使用意味着一个处理另一个的抽象。

【讨论】:

将大型 JSON 对象作为流处理可能是个好主意,而不是将所有内容都加载到内存中。 当然,这就是许多 JSON 包所提供的:Jackson 和 GSON 都有流式解析器/生成器,甚至允许将流式访问和部分数据(子树)的数据绑定结合起来。所以 SAX 只是一种流式 API,不是为 JSON 而是为 XML 设计的。 我知道这个答案是多年前写的,但我很好奇为什么在您看来“尝试将 JSON 视为 XML 是一个坏主意”? @stakx 因为它们的数据模型根本不同:XML 对文本数据(文本标记)使用分层模型,基于 JSON 帧的数据模型。这增加了很多摩擦;例如,XML 中不存在 Array/Object 差异的 JSON 概念,其中一切都是具有文本内容的元素/属性,在某种程度上只有对象。如果没有外部元数据(模式或 proglang 对象),一般情况下不可能在模型之间进行可靠的转换。 实际上,现在您已经充分解释了您的用例——将 JSON 转为 XML,因此您可以使用 xslt,然后将 XML 转回 JSON——我不反对。如果是这样,则附加元数据仅在处理期间可见,而不是用户会接触到的内容。如果是这样...是的,如果您喜欢 XSLT(我同意似乎没有好的 json 特定转换工具),为什么不呢?感谢您抽出宝贵时间:我在这里做了一些错误的假设。所以:我担心的是暴露带有修饰的 JSON,这(如果不是 XSLT)是无关紧要的。【参考方案3】:

我开发了一个基于流式 StAX 的转换器:https://github.com/AtomGraph/JSON2XML

它读取任何 JSON 数据并生成 XSLT 3.0 中指定的 XML Representation of JSON。

即使没有 XSLT 3.0 处理器,JSON2XML 也可以使用 XSLT 进行 JSON 转换。例如,您可以通过在转换之前使用 JSON2XML 来简单地预处理数据,并将其通过管道传输到 XSLT 2.0 样式表中。这样,您的样式表将与 XSLT 3.0 保持前向兼容,因为 XML 表示完全相同。

欢迎提出反馈和请求。

【讨论】:

以上是关于是否有一个 SaxParser 可以读取 json 并触发事件,所以它看起来像 xml的主要内容,如果未能解决你的问题,请参考以下文章

SAXParser 无法解析某些字符

如何在 Java 中使用 SAX Parser 检查 xml 标签是不是具有属性?

是否有在 Windows Mobile 上用 C# 读取 JSON 的库? [关闭]

是否有一种通用的方法来读取 spark.json 中的多行 json。更具体地说,火花?

如何从 Java 文件中读取许多 json 对象?

是否有通用的方法来读取spark中的多线json。更具体的是火花?