是否有JSON的流媒体API?

时间:2009-01-14 19:42:14

标签: json streaming

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

11 个答案:

答案 0 :(得分:59)

一些JSON解析器确实提供增量(“流”)解析器;对于Java,至少从json.org页面的解析器提供这样的接口:

(除了another answer引用的Software Monkey的解析器)

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

编辑(2011年6月):Gson也有自己的streaming API(与gson 1.6一起)

答案 1 :(得分:22)

通过DOM,我假设您的意思是解析器在您使用它之前立即读取整个文档。请注意,现在说DOM倾向于暗示XML,但IMO并不是真正的准确推断。

所以,回答你的问题 - “是”,有流API和“否”,DOM不是唯一的方法。也就是说,将JSON文档作为流处理通常会产生问题,因为许多对象不是简单的字段/值对,而是包含其他对象作为值,您需要解析它们来处理,这往往会导致递归。但对于简单的消息,您可以使用基于流/事件的解析器执行有用的操作。

我为JSON写了一个拉事件解析器(它是一个类,大约700行)。但我见过的大多数其他人都是面向文档的。我在解析器之上构建的一个层是一个文档阅读器,它占用了大约30个LOC。我在实践中只使用过我的解析器作为文档加载器(出于上述原因)。

我相信如果您在网上搜索,您会找到基于拉动和推送的JSON解析器。

编辑:我有posted the parser到我的网站下载。包括一个可编辑的工作类和一个完整的例子。

EDIT2:您还需要查看JSON website

答案 2 :(得分:14)

正如stefanB所提到的,http://lloyd.github.com/yajl/是一个用于流解析JSON的C库。该页面上还提到了许多其他语言的包装器:

  
      
  • yajl-ruby - YAJL的红宝石绑定
  •   
  • yajl-objc - YAJL的Objective-C绑定
  •   
  • YAJL IO绑定(针对IO语言)
  •   
  • Python绑定有两种形式,py-yajl或yajl-py
  •   
  • yajl-js - node.js绑定(镜像到github)。
  •   
  • lua-yajl - lua bindings
  •   
  • ooc-yajl - ooc bindings
  •   
  • yajl-tcl - tcl bindings
  •   

其中一些可能不允许流式传输,但其中许多肯定会这样做。

答案 3 :(得分:8)

免责声明:我建议我自己的项目。

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

Oboe.js website

这个想法是允许流式解析,但不要求程序员听取许多不同的事件,比如原始SAX。我喜欢SAX,但它往往是大多数人需要的低水平。您可以通过注册JSONPath模式从JSON流中侦听任何有趣的节点。

代码在Github上:

Oboe.js Github page

答案 4 :(得分:7)

如果您想使用纯javascript和在node.js和浏览器中运行的库,您可以尝试单簧管:

https://github.com/dscape/clarinet

解析器是基于事件的,因为它是流式传输,所以可以处理大型文件。 API非常接近sax,代码是从sax-js派生的。

答案 5 :(得分:3)

LitJSON支持流式API。引自manual

“一些开发人员可能熟悉的处理JSON数据的替代接口是通过类,可以以类似流的方式读取和写入数据。这些类是JsonReader和{{1} }。

“这两种类型实际上是这个库的基础,而JsonWriter类型是建立在它们之上的,因此在某种程度上,开发人员可以将读者和编写者类视为低 - LitJSON的关卡编程接口。“

答案 6 :(得分:3)

这是一个NodeJS NPM库,用于解析和处理JSON流: https://npmjs.org/package/JSONStream

答案 7 :(得分:3)

如果您正在寻找专门针对Python的内容,那么ijson会声称支持它。但是,它只是一个解析器,所以我没有遇到任何可以生成json作为流的Python。

对于C ++,有rapidjson声称支持以流方式解析和生成。

答案 8 :(得分:2)

对于Python来说,ijson的另一种选择(显然更轻,效率更高)是jsaone(参见粗略基准测试的链接,显示jsaone的速度提高了约3倍)。

免责声明:我是jsaone的作者,我所做的测试非常基础......我会很高兴被证明是错的!

答案 9 :(得分:1)

回答问题标题:YAJL C:中的JSON解析器库

  

YAJL记得要求的所有州   支持重新启动解析。这个   允许解析以递增方式发生   从磁盘或网络读取数据。

所以我猜使用yajl来解析JSON可以被视为处理数据流。

答案 10 :(得分:-6)

在回答你的第二个问题时,不,许多语言都有JSON解析器。 PHP,Java,C,Ruby等等。只需谷歌选择您选择的语言加上“JSON解析器”。