Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有JSON的流式API吗?_Json_Streaming - Fatal编程技术网

有JSON的流式API吗?

有JSON的流式API吗?,json,streaming,Json,Streaming,DOM是解析JSON的唯一方法吗?在回答第二个问题时,不,许多语言都有JSON解析器。PHP、Java、C、Ruby和许多其他语言。只需在Google上搜索您选择的语言加上“JSON解析器”。根据DOM,我假设您的意思是,解析器在您使用它之前会立即读取整个文档。注意,现在说DOM往往意味着XML,但在我看来,这并不是一个真正准确的推论 因此,在回答您的问题时——“是”,有流式API,“否”,DOM不是唯一的方法。这就是说,将JSON文档作为流处理通常是有问题的,因为许多对象不是简单的字段/值对,

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

在回答第二个问题时,不,许多语言都有JSON解析器。PHP、Java、C、Ruby和许多其他语言。只需在Google上搜索您选择的语言加上“JSON解析器”。

根据DOM,我假设您的意思是,解析器在您使用它之前会立即读取整个文档。注意,现在说DOM往往意味着XML,但在我看来,这并不是一个真正准确的推论

因此,在回答您的问题时——“是”,有流式API,“否”,DOM不是唯一的方法。这就是说,将JSON文档作为流处理通常是有问题的,因为许多对象不是简单的字段/值对,而是包含其他对象作为值,您需要对其进行解析以进行处理,这往往会导致递归。但是对于简单的消息,您可以使用基于流/事件的解析器做一些有用的事情

我已经为JSON编写了一个拉事件解析器(它是一个类,大约700行)。但我看到的其他大多数都是面向文档的。我在解析器之上构建的一个层是文档阅读器,它花费了大约30个LOC。实际上,我只将解析器用作文档加载器(出于上述原因)

我相信如果你搜索网络,你会发现基于拉和推的JSON解析器

编辑:我必须下载我的网站。包括一个可编译的工作类和一个完整的示例


EDIT2:您还需要了解。

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

  • (拉式接口)
  • (SAX风格的推送接口)
(除了所指的软件Monkey解析器之外)

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


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

LitJSON支持流式API。引述:

“一些开发人员可能熟悉的处理JSON数据的另一种接口是通过类,这些类可以以流式方式读写数据。这些类是
JsonReader
JsonWriter


这两种类型实际上是该库的基础,而“代码”> JSONMAPPER < /C>类型是建立在它们之上的,因此开发者可以把读写器类看作是LitJSON的低级编程接口。

< P>回答问题标题:C:< /P>中的JSON解析器库 YAJL记住所有需要执行的状态 支持重新启动解析 允许以增量方式进行分析 当数据从磁盘或网络中读取时

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

正如stefanB所提到的,是一个用于解析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绑定

其中一些可能不允许流媒体,但其中许多确实允许。

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


解析器是基于事件的,因为它是流式的,所以可以处理巨大的文件。API非常接近sax,代码来自sax js。

这里有一个用于解析和处理JSON流的NodeJS NPM库:

如果您专门寻找Python,那么就声称支持它。但是,它只是一个解析器,所以我没有发现任何Python可以将json生成为流


C++中,声明支持流式解析和生成。对于Python,

< P>,IjSon是一种替代方案(明显较轻和更有效)(参见粗糙基准的链接,显示JSAONE快约3X)。
免责声明:我是jsaone的作者,我做的测试非常基本……我很高兴被证明是错的!

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

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

其思想是允许流解析,但不要求程序员监听许多不同的事件,如原始SAX。我喜欢SAX,但它往往是大多数人所需要的非常低的级别。通过注册JSONPath模式,您可以监听JSON流中任何感兴趣的节点

代码位于Github上的以下位置:


这并没有回答问题:问题作者问的根本不是一般的JSON解析器,而是流式解析器。什么是流式解析器?非流式解析器一次将所有内容加载到内存中。糟糕。流式解析器将其输入一次一个字节拉入解析器,每次输入达到一定程度时,它都会调用回调目标。这样,文件可以任意长,并且可以及时读入,而无需将其全部加载到内存中。这会导致混乱。另一个原因:使用Python,您可以得到一个答案。尽管给出答案的人可能已经推荐了解析器,但OP没有要求任何人“推荐或查找工具、库或喜爱的非现场资源”“…最后,为了回答OQ问题,OQ过早地、不合理地关闭了,但却收到了这么多好的、有用的答案,不,“没有”JSON的流式API,意思是“有”(一种标准化的、普遍采用的、单一的)API,例如,在浏览器(即DOM等)中表示网页