【问题标题】:Is there a streaming API for JSON? [closed]是否有 JSON 的流 API? [关闭]
【发布时间】:2021-07-21 07:51:44
【问题描述】:

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

【问题讨论】:

  • 尽管那些给出答案的人可能已经推荐了解析器,但 OP没有要求任何人“推荐或查找工具、库或收藏夹-网站资源”。
  • ...并最终回答过早且不合理地关闭但收到如此多好的和有用的答案的 OQ,不,从某种意义上说,“没有”“JSON 的流 API” “存在”(一种标准化且普遍采用的单一)API,用于表示浏览器中的网页(即 DOM 等)。您可以选择许多不同的解决方案(这一事实证明了那些试图提供帮助但没有以字面方式回答 OQ 的答案是合理的)。
  • 没有理由关闭这个问题。

标签: json streaming


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案2】:

对于 DOM,我假设您的意思是解析器会在您使用它之前一次读取整个文档。请注意,现在说 DOM 往往意味着 XML,但 IMO 这并不是一个准确的推论。

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

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

我敢肯定,如果您搜索网络,您会发现基于拉取和推送的 JSON 解析器。

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

EDIT2:您还需要查看JSON website

【讨论】:

    【解决方案3】:

    正如 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 绑定
    • ooc-yajl - ooc 绑定
    • yajl-tcl - tcl 绑定

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

    【讨论】:

      【解决方案4】:

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

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

      Oboe.js website

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

      代码在 Github 上:

      Oboe.js Github page

      【讨论】:

      • Oboe.js 网站链接似乎需要身份验证。
      【解决方案5】:

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

      https://github.com/dscape/clarinet

      解析器是基于事件的,由于它是流式处理的,因此可以处理大文件。 API 非常接近 sax,代码是从 sax-js 分叉出来的。

      【讨论】:

        【解决方案6】:

        LitJSON 支持流式 API。引用自manual

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

        "这两种类型其实是这个库的基础,JsonMapper 类型是建立在它们之上的,所以在某种程度上,开发者可以将 reader 和 writer 类视为低级编程LitJSON 的接口。”

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

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

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

              【讨论】:

                【解决方案10】:

                回答问题标题:YAJLa JSON parser library in C:

                YAJL 会记住所有需要的状态 支持重启解析。这 允许以增量方式进行解析 从磁盘或网络中读取数据。

                所以我猜用 yajl 解析 JSON 可以看作是处理数据流。

                【讨论】:

                  【解决方案11】:

                  在回答您的第二个问题时,不,许多语言都有 JSON 解析器。 PHP、Java、C、Ruby 等等。只需 Google 即可获得您选择的语言以及“JSON 解析器”。

                  【讨论】:

                  • 这不回答问题:问题作者问的根本不是一般的 JSON 解析器,而是流式解析器。
                  • 什么是流解析器?
                  • 非流式解析器一次将所有内容加载到内存中。坏的。流解析器一次将一个字节的输入拉入解析器,每次输入达到某个目标时,它都会调用一个回调。这样,文件可以任意长,并按时读取,而无需将其全部加载到内存中。这会导致抖动。
                  猜你喜欢
                  • 1970-01-01
                  • 2016-09-13
                  • 2018-03-23
                  • 2010-09-23
                  • 2015-08-21
                  • 2014-04-30
                  • 1970-01-01
                  • 2019-04-19
                  相关资源
                  最近更新 更多