有没有JSON的stream媒体API?

DOM是parsingJSON的唯一方法吗?

一些JSONparsing器确实提供增量(“stream式”)parsing器; 对于Java,至less下面的json.org页面的parsing器提供了这样一个接口:

  • jackson (拉接口)
  • Json-simple (SAX式推送接口)

(除了由另一个答案引用的Software Monkey的parsing器)

实际上,很多JSONparsing器不提供这个简单的底层接口 – 毕竟,他们已经需要实现底层parsing,所以为什么不公开它。

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

通过DOM,我假定你的意思是parsing器在你使用之前一次读取整个文档。 请注意,现在说DOM往往意味着XML,但IMO并不是一个真正的推断。

所以,回答你的问题 – “是”,有stream媒体API和“否”,DOM不是唯一的方法。 也就是说,将JSON文档作为stream处理通常是有问题的,因为许多对象不是简单的字段/值对,而是包含其他对象作为值,需要进行parsing来处理,而这往往会导致recursion。 但是对于简单的消息,您可以使用基于stream/事件的parsing器来做有用的事情。

我已经为JSON编写了一个拉事件parsing器(这是一个类,大约700行)。 但是我所看到的大多数其他人都是面向文档的。 我在parsing器上创build的一个层是一个文档阅读器,大约需要30个LOC。 我只用过我的parsing器作为文件加载器(由于上述原因)。

我相信,如果你searchnetworking,你会发现拉和基于JSONparsing器。

编辑:我已经发布parsing器到我的网站下载。 包括一个可用的编译类和一个完整的例子。

编辑2:你也想看看JSON网站 。

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

  • yajl-ruby-ruby绑定到YAJL
  • 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绑定

其中一些可能不允许stream式传输,但是其中很多肯定会。

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

我使用Javascript来维护stream式JSONparsing器,它结合了SAX和DOM的一些特性:

Oboe.js网站

这个想法是允许streamparsing,但不要求程序员听到很多不同的事件,如原始SAX。 我喜欢SAX,但是对于大多数人所需要的,它往往是相当低的水平。 您可以通过注册JSONPath模式来侦听来自JSONstream的任何感兴趣的节点。

代码在Github这里:

Oboe.js Github页面

如果你想使用纯javascript和一个运行在node.js和浏览器中的库,你可以试试单簧pipe:

https://github.com/dscape/clarinet

parsing器是基于事件的,因为它是stream媒体,所以可以处理大文件。 API非常接近萨克斯风格,代码从萨克斯js派生。

LitJSON支持stream式API。 从手册引用:

“一些开发人员可能熟悉的处理JSON数据的另一种接口是通过类来实现以类stream的方式读写数据,这些类是JsonReaderJsonWriter

“这两种types实际上就是这个库的基础,而JsonMappertypes就是build立在它们之上的,所以开发人员可以将读写器类看作是LitJSON的低级编程接口。

下面是一个用于parsing和处理JSONstream的NodeJS NPM库: https : //npmjs.org/package/JSONStream

如果你正在寻找Python,那么ijson声称支持它。 然而,它只是一个parsing器,所以我没有碰到任何可以生成json作为stream的Python。

对于C ++来说, rapidjson声称支持以stream方式进行parsing和生成。

对于Python来说,ijson的替代(显然更轻,更高效)是jsaone (请参阅粗略基准的链接,显示jsaone快大约3倍)。

免责声明 :我是jsaone的作者,我做的testing是非常基本的…我会很乐意被certificate是错误的!

回答问题标题: YAJL JSONparsing器库在C:

YAJL记得支持重启parsing所需的所有状态。 这允许parsing在数据从磁盘或networking读取时递增地发生。

所以我想用yajl来parsingJSON可以认为是处理数据stream。

在回答你的第二个问题时,不,很多语言都有JSONparsing器。 PHP,Java,C,Ruby等等。 只要你select的语言加上“JSONparsing器”的谷歌。