DOM是解析JSON的唯一方法吗?
答案 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的一些功能:
这个想法是允许流式解析,但不要求程序员听取许多不同的事件,比如原始SAX。我喜欢SAX,但它往往是大多数人需要的低水平。您可以通过注册JSONPath模式从JSON流中侦听任何有趣的节点。
代码在Github上:
答案 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解析器”。