gpt4 book ai didi

javascript - 如何在 JS 中解析流中的第一个 JSON 对象

转载 作者:可可西里 更新时间:2023-11-01 01:18:18 25 4
gpt4 key购买 nike

我有一个 JSON 对象流,就像 JSON-RPC over TCP 或 WebSockets 一样。没有长度前缀或定界符,因为 JSON 是自定界的。所以,当我从流中读取时,我可能会得到这样的结果:

{"id":1,"result":{"answer":23},"error":null}
{"id":2,"result":{"answer":42},"error":null}
{"id":3,"result":{"answ

我需要一个一个地解析每个 JSON 对象。我无法使用 JSON.parse 执行此操作,因为它只会在最后抛出无关数据的语法错误。

当然,对于那个例子,我可以逐行进行,但我不能依赖那样的空白; JSON-RPC 可以很容易地看起来像这样:

{
"id": 1,
"result": {
"answer": 23
},
"error":null
}

或者这个:

{"id":1,"result":{"answer":23},"error":null}{"id":2,"result":{"answer":42},"error":null}

对于大多数其他语言的解析器,显而易见的答案是这样的(以 Python 为例):

buf = ''
decoder = json.JSONDecoder()
def onReadReady(sock):
buf += sock.read()
obj, index = decoder.raw_decode(buf)
buf = buf[index:]
if obj:
dispatch(obj)

但是我在 JS 中找不到类似的东西。我查看了我能找到的每个 JS 解析器,它们都有效地等同于 JSON.parse。

我尝试查看各种 JSON-RPC 框架,看看它们如何处理这个问题,但它们就是没有。他们中的许多人假设 recv 将始终准确地返回一个发送(这适用于 JSON-RPC over HTTP,但不适用于 TCP 或 WebSockets——当然,它可能在本地测试中似乎有效)。其他人实际上并不处理 JSON-RPC,因为他们增加了对空格的要求(其中一些甚至对 JSON-RPC 无效)。

我可以编写一个分隔符检查来平衡括号和引号(当然,处理转义和引用),或者只是从头开始编写一个 JSON 解析器(或者从另一种语言移植一个,或者修改 http://code.google.com/p/json-sans-eval/ ),但我可以相信以前没有人这样做过。

编辑:我自己做了两个版本,http://pastebin.com/fqjKYiLw基于 json-sans-eval 和 http://pastebin.com/8H4QT82b基于 Crockford 的引用递归下降解析器 json_parse.js。我仍然更愿意使用已经过测试和被其他人使用的东西,而不是自己编写代码,所以我将这个问题悬而未决。

最佳答案

在寻找替代方案一个月但没有找到任何有用的东西之后,我决定编写一堆不同的实现并对其进行测试,然后我对 Crockford 的引用递归下降解析器进行了修改(如问题中所述, available here ).

它不是最快的,但在我进行的每次测试中都足够快了。更重要的是,它捕获明显错误的 JSON,当它与不完整的 JSON 没有歧义时,比大多数其他替代方法要好得多。最重要的是,它只需要对一个众所周知且经过测试的代码库进行很少且非常简单的更改,这让我对其正确性更有信心。

不过,如果有人知道比我的库更好的库(并且只是被很多项目而不是我一个人使用就可以算作主要资格),我很想知道它。

关于javascript - 如何在 JS 中解析流中的第一个 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9829811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com