我一直在解析使用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”实现中的错误或什么?
谢谢。
答案 0 :(得分:3)
您可以从某个地方复制JSON.parse()的实现(比如jQuery),更改它的名称,以便您可以直接调用它,调整实现,以便它永远不会检测到内置的解析器,因此它始终使用JS解析器,然后更改您的代码以使用解析器的新JS版本,然后在javascript调试器中跟踪它,直到找到它不喜欢的内容。
答案 1 :(得分:2)
要检查的一件事是你的JSON字符串中是否有引号和斜杠。如果是,他们需要被转义:
{
"key": "i've \"quotes\" in me",
"key2": "and \\slashes too"
}
此外,JSONLint会为您提供错误的确切位置。
根据JSON.org,您的字符串中不能包含引号和斜杠,因此您需要将它们转义。
答案 2 :(得分:1)
我认为你不需要调用JSON.parse:
JSON.parse({"key": "whatever"}) // Syntax Error ILLEGAL
因为它已经是一个对象。我也很想看到以下代码的结果:
eval("(" + json + ")");
或
JSON.parse(decodeURIComponent(json));
答案 3 :(得分:0)
无法详细说明细节,但可能是您的验证器正在进行非严格的解析,而您的javascript可能正在进行严格的解析......