有没有针对JSON的流式API?

68

DOM是解析JSON的唯一方式吗?


12
回答者可能推荐解析器,但是OP并没有要求任何人“推荐或找到工具、库或喜欢的离线资源”。 - iconoclast
5
为了最终回答这个过早且毫无理由关闭,但收到了很多好的和有用的答案的 OQ,是否存在“流式 JSON API”?答案是没有,“存在”的意义是(标准化和普遍采用、单一)API,例如在浏览器中表示网页的方式(即 DOM 等)。有许多不同的解决方案可供选择(这一事实证明了那些试图提供帮助但没有以文字方法回答 OQ 的答案是正确的)。 - flow
4
这个问题被关闭的原因无法理解。 - Jeryl Cook
11个回答

59

一些JSON解析器提供增量(“流式”)解析器;对于Java来说,至少以下来自json.org页面的解析器提供这样的接口:

(除了another answer提到的Software Monkey的解析器之外)

实际上,很奇怪为什么那么多JSON解析器都没有提供这个简单的低级别接口--毕竟,它们已经需要实现低级别解析,为什么不公开呢。

编辑(2011年6月):Gson也有自己的streaming API(使用gson 1.6)


另一个链接:http://www.salsify.com/blog/json-streaming-parser-for-php - Rob Gonzalez
使用Python,您可以获得我在此处编写的SAX类似的推式解析器 - keios

22
通过DOM,我认为你的意思是解析器在你使用它之前需要一次性读取整个文档。需要注意的是,现在说DOM往往意味着XML,但是在我看来,这并不是一个准确的推断。
所以,回答你的问题 - "是",有流API和"否",DOM不是唯一的方法。话虽如此,在流中处理JSON文档通常是有问题的,因为许多对象不是简单的字段/值对,而是包含其他对象作为值,您需要解析这些对象才能进行处理,并且这往往会成为递归的事情。但对于简单的消息,您可以使用基于流/事件的解析器做一些有用的事情。
我曾经为JSON编写了一个pull-event解析器(它是一个类,大约有700行)。但我看到的大多数其他解析器都是面向文档的。我在我的解析器上构建的其中一层是文档阅读器,大约需要30行代码。出于以上原因,我只曾将我的解析器实际应用于文档加载器。
我相信,如果你搜索网络,你会找到针对JSON的pull和push解析器。
编辑:我已经在我的网站上发布了该解析器供下载。其中包括一个可工作的可编译类和一个完整的示例。
编辑2:你还需要查看JSON网站

14

就像stefanB提到的那样,http://lloyd.github.com/yajl/是用于流解析JSON的C语言库。该页面上还提到了许多其他语言的封装:

  • yajl-ruby - 适用于YAJL的Ruby绑定
  • yajl-objc - 适用于YAJL的Objective-C绑定
  • YAJL IO绑定(适用于IO语言)
  • Python绑定有两种风格,py-yajl或yajl-py
  • yajl-js - node.js绑定(镜像到github)
  • lua-yajl - lua绑定
  • ooc-yajl - ooc绑定
  • yajl-tcl - tcl绑定

其中一些可能不支持流式处理,但是许多语言封装确实支持。


7

免责声明:我在推荐自己的项目。

我在Javascript中维护了一个流式JSON解析器,它结合了SAX和DOM的一些特点:

Oboe.js 网站

这个想法是允许流式解析,但不需要像原始SAX那样要求程序员监听很多不同的事件。我喜欢SAX,但对于大多数人来说,它往往过于底层。您可以通过注册JSONPath模式来监听JSON流中的任何有趣节点。

代码在Github上:

Oboe.js Github页面


1
Oboe.js 网站链接似乎需要身份验证。 - jacobq

7
如果你想使用纯JavaScript和一个可以在node.js和浏览器中运行的库,你可以尝试clarinet:

https://github.com/dscape/clarinet

解析器是基于事件的,由于它是流式的,因此处理大型文件变得可能。API非常接近sax,并且代码是从sax-js分叉的。

3
如果您特别寻找Python相关的内容,那么ijson声称支持它。但是,它只是一个解析器,所以我没有找到任何可以生成json流的Python解决方案。
对于C++,rapidjson声称支持流式解析和生成。

3
LitJSON 支持流式 API。引用自手册
“一种处理 JSON 数据的替代接口对于一些开发者来说可能更熟悉,通过这些类可以以流式方式读取和写入数据。这些类型是 JsonReaderJsonWriter
实际上,这两种类型是该库的基础,而 JsonMapper 类型则建立在它们之上,因此,开发者可以将读取器和写入器类看作是 LitJSON 的低级编程接口。”

2

对于Python来说,jsaone是一个备选方案(据称更轻量、更高效),替代了ijson(查看链接以获取大致的基准测试结果,显示jsaone大约快3倍)。

免责声明:我是jsaone的作者,而且我所做的测试非常基础……如果被证明是错误的,我将很高兴接受!


2

1

回答问题标题:YAJL是C语言中的JSON解析库:

YAJL记住了支持重新启动解析所需的所有状态。这允许在从磁盘或网络读取数据时逐步进行解析。

因此,我认为使用yajl解析JSON可以被视为处理数据流。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接