当前位置: 首页 > 面试题库 >

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

武嘉祥
2023-03-14
问题内容

我有一个JSON对象流,就像通过TCP或WebSockets的JSON-
RPC一样。没有长度前缀或定界符,因为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将始终只返回一个发送(这对于通过HTTP的JSON-
RPC正常工作,但对于通过TCP或WebSocket的JSON-RPC则工作正常,尽管它当然可以在本地测试中工作)。其他人实际上不处理JSON-
RPC,因为它们在空白上添加了要求(其中某些要求甚至对JSON-RPC无效)。

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

编辑:我已经做了两个版本的自己,http://pastebin.com/fqjKYiLw基于JSON的SAN-
EVAL和http://pastebin.com/8H4QT82b基于Crockford的参考递归下降解析器json_parse.js。我仍然更喜欢使用经过其他人测试和使用的东西,而不是自己编写代码,因此我将这个问题留待解决。


问题答案:

经过一个月的搜索,没有找到任何有用的东西之后,我决定编写一堆不同的实现并进行测试,然后我对Crockford的参考递归下降解析器进行了修改

它不是最快的,但是在我做的每项测试中都足够快。更重要的是,当不与不完整的JSON保持一致时,它可以捕获明显错误的JSON,这比大多数其他替代方法要好得多。最重要的是,它与著名且经过测试的代码库之间的更改非常少,而且非常简单,这使我对其正确性更有信心。

但是,如果有人知道比我的图书馆更好的图书馆(并且被很多项目而不是仅由我使用将被视为主要资格),我很想知道这一点。



 类似资料:
  • 问题内容: 我正在解析包含json对象的文件。问题是某些文件在一行中有多个对象。例如: 我做了一个函数,尝试在没有左括号的情况下解析子字符串,但是值中可能有大括号。我尝试过通过检查引号的开头和结尾来跳过值,但是也有带有转义引号的值。有关如何处理此问题的任何想法? 我的尝试: 问题答案: 简单但不够健壮的版本: 如果包含在字符串中,则将失败 正如其他建议一样,您然后可以尝试解析每个元素。如果无效,则

  • 问题内容: 我有一个非常大的JSON文件,格式如下: 它看起来像一个JSONArray。所有记录都写在同一行中。 您能帮我如何使用Java解析此文件。我想读取每个JSON对象并显示所有全名和ID。以下是我的尝试,但是我的代码无法正常工作: 问题答案: 好的,伙计们……解决了我的问题。我正在发布解决方案,以防有人再次遇到相同的问题,可以使用我的解决方案。我的解决方案部分是由Rahul Rabhadi

  • 问题内容: 数组: 如何在C#中解析上述json响应 问题答案: 在您提供的字符串 不正确 的格式,该阵列应该是: 您可以使用将其转换: 该工具在nuget中也可用。 如果要使用强类型:

  • 问题内容: 我在从JSON对象提取值时遇到一些问题。这是我的代码 被声明为。代码运行时显示。如果将鼠标悬停在调试模式下,则可以看到对象中的所有值和名称。 我也试过 这回来了。即使将鼠标悬停在对象上,我也可以读取对象中的值。 这是我将使用的JSON字符串的示例。 问题答案: 最后,我使用而不是来解决它,然后将其强制转换为。

  • 问题内容: JSON对象 我正在尝试在android studio中解析此对象,但是即时通讯收到错误: 这是我正在使用的代码 问题答案: 您的json包含一个对象,而不是数组。更换 通过

  • 问题内容: 我很难找到一种方法来解析JSONArray。看起来像这样: 如果JSON的写法不同,我知道如何解析它(换句话说,如果我返回了json对象而不是对象数组)。但这就是我所必须拥有的。 *编辑:这是一个有效的json。我使用此json制作了一个iPhone应用,现在我需要在Android上使用它,但无法弄清楚。有很多示例,但是它们都是与JSONObject相关的。我需要JSONArray。