告诉错误位置的 JavaScript JSON 解析器
Posted
技术标签:
【中文标题】告诉错误位置的 JavaScript JSON 解析器【英文标题】:JavaScript JSON parser that tells error position 【发布时间】:2011-10-30 17:38:59 【问题描述】:我在解析通过 WebSocket 接收的 JSON 时遇到了一些麻烦(原始问题 - Parse JSON received with WebSocket results in error)。 JSON 字符串本身是有效的(使用多个 JSON 验证器测试),但 JSON.parse 会引发异常。我试图弄清楚它无法解析的究竟是什么,但我得到的唯一东西是“SyntaxError:unexpected_token ILLEGAL”,它没有说明失败令牌的确切位置在哪里。有没有办法提取这些信息?
更新:如果我将该 JSON 字符串复制粘贴到静态文件(例如“data.json”),然后检索它并使用相同的函数 (JSON.parse) 对其进行解析 - 然后它工作正常。 所以我假设发生了一些棘手的事情,我想到了换行符(可能是 \n 而不是 \r\n 或反之亦然),但完全删除所有换行符并没有帮助。我认为这很可能是编码问题,但数据是通过 websocket 接收的,根据文档,它是 utf-8 字符串。
第二次更新:如果我从这里使用“json_parse”就可以了:https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js 然后它工作正常!这是否意味着这是 Chrome 使用的“JSON.parse”实现中的错误或什么?
谢谢。
【问题讨论】:
试试jslint.org?如果不是“私人”数据,请在此处发布错误的 json。 比jslint更好的是jsonlint 返回“JSON: good.”,jsonlint 说它也是有效的。即使我将它从我的网页复制粘贴回 JSON.parse - 它也会解析字符串。请参阅“更新”。 我在从 Websockets 接收字符串时也遇到了这个问题。我的字符串就像"s":\"t\"
一样简单。删除反斜杠可以解决问题。谁能帮我解决这个问题?
【参考方案1】:
您可以从某个地方(例如从 jQuery 中)复制 JSON.parse() 的实现,更改它的名称以便您可以直接调用它,调整实现使其永远不会检测到内置解析器,因此它始终使用JS 解析器,然后更改您的代码以使用解析器的新 JS 版本,然后在 javascript 调试器中跟踪它,直到找到它不喜欢的部分。
【讨论】:
谢谢!我也想过这个问题,但不幸的是 jQuery 没有它自己的解析器,根据它只使用 JSON.parse 或 eval 的源代码。但是,我找到了 JSON.parse 源代码:json.org/js.html,它对我有用。所以基本上如果我使用内置的 JSON.parse - 它会给出一个错误,如果我使用来自json.org/js.html 的 JSON.parse 实现,那么它工作正常。我想知道这是一个错误还是什么。【参考方案2】:要检查的一件事是您的 JSON 字符串中是否包含引号和斜杠。如果是,则需要对其进行转义:
"key": "i've \"quotes\" in me",
"key2": "and \\slashes too"
另外,JSONLint 会为您提供错误的确切位置。
根据JSON.org,您的字符串中不能有引号和斜杠,因此您需要对它们进行转义。
【讨论】:
我想到了斜杠,但在字符串中没有找到。另外,我没有在代码中定义字符串,它是通过 websocket 接收的。 JSONLint 是否有我可以在 JS 代码中使用的 API? 理想情况下,响应应该格式正确(即转义引号和斜杠),但如果您无法更改,则在调用 @ 之前在您的 JavaScript 代码中替换字符串(以转义引号/斜杠) 987654326@。您可以使用 JavaScript 版本的 JSONLint:github.com/zaach/jsonlint【参考方案3】:我认为你不需要调用 JSON.parse:
JSON.parse("key": "whatever") // Syntax Error ILLEGAL
因为它已经是一个对象。我也很想看看下面代码的结果:
eval("(" + json + ")");
或者
JSON.parse(decodeURIComponent(json));
【讨论】:
我正在使用 websocket 接收字符串,因此它是通过传递给“socket.onmessage”回调的事件的“数据”成员访问的。它绝对是一个字符串,而不是一个对象(我可以在 JavaScript 控制台中看到它显示为一个字符串)。 eval 失败,就像 JSON.parse 和 decodeURIComponent 没有帮助一样不幸。【参考方案4】:无法详细说明,但可能是您的验证器正在执行非严格解析,而您的 javascript 可能正在执行严格解析...
【讨论】:
好像不是这样,我已经更新了帖子。 “如果我将该 JSON 字符串复制粘贴到静态文件(例如“data.json”),然后检索它并使用相同的函数 (JSON.parse) 对其进行解析 - 那么它工作正常”以上是关于告诉错误位置的 JavaScript JSON 解析器的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中压缩 JSON 并在 Javascript 中解压缩 [关闭]