我为什么会收到意外的令牌?

时间:2013-09-07 20:25:03

标签: javascript json parsing

k ="[{\"id\": 1, \"latitude\": \"52.511467\", \"longitude\": \"13.447179\", \"bearing\": \"0.000000\", \"speed\": \"0.000000\", \"device_status\": 0, \"timestamp\": \"2013-08-18 00:00:00\"}, {\"id\": 3, \"latitude\": \"53.511467\", \"longitude\": \"14.447179\", \"bearing\": \"1.000000\", \"speed\": \"1.000000\", \"device_status\": 2, \"timestamp\": \"2013-08-18 00:00:00\"}, {\"id\": 4, \"latitude\": \"54.511467\", \"longitude\": \"15.447179\", \"bearing\": \"1.000000\", \"speed\": \"1.000000\", \"device_status\": 2, \"timestamp\": \"2013-08-18 00:00:00\"}, {\"id\": 5, \"latitude\": \"33.511467\", \"longitude\": \"72.447179\", \"bearing\": \"1.000000\", \"speed\": \"1.000000\", \"device_status\": 1, \"timestamp\": \"2013-08-18 00:00:00\"}]"

R = JSON.parse(k)

SyntaxError:意外的令牌

m =JSON.parse("[{\"id\": 2, \"da\": \"1\"}]")

正常运行

2 个答案:

答案 0 :(得分:3)

这是因为当它从服务器返回时,结果是将存储作为字符串存储,因此字符串本身在每个\之前包含"转义字符。转义JSON字符串中的"字符无效。

就像在做:

var json = '{\\"test\\":\\"test\\"}';
json //"{\"test\":\"test\"}"
JSON.parse(json); //SyntaxError: Unexpected token \

但是,当您接受该字符串并将其直接放在控制台中时,\字符将扮演其转义角色,并且最终不会成为实际字符串的一部分。基本上,服务器端生成的JSON字符串不应该转义"个字符。

您也可以替换客户端的无效ecape序列,但我不建议这样做:

JSON.parse(json.replace(/\\"/g, '"'));

答案 1 :(得分:0)

根据您评论中的图片,您没有在帖子中讲述整个故事。如果你做一个console.log(k),你会发现它看起来与你在控制台中看到的一样,只是currentTrackData的输出:

>>> [{\"id\": 1, \"latitude\": \"52.511467\", \"longitude\": \"13.447179\", \"bearing\": \"0.000000\", \"speed\": \"0.000000\", \"device_status\": 0, \"timestamp\": \"2013-08-18 00:00:00\"}, {\"id\": 3, \"latitude\": \"53.511467\", \"longitude\": \"14.447179\", \"bearing\": \"1.000000\", \"speed\": \"1.000000\", \"device_status\": 2, \"timestamp\": \"2013-08-18 00:00:00\"}, {\"id\": 4, \"latitude\": \"54.511467\", \"longitude\": \"15.447179\", \"bearing\": \"1.000000\", \"speed\": \"1.000000\", \"device_status\": 2, \"timestamp\": \"2013-08-18 00:00:00\"}, {\"id\": 5, \"latitude\": \"33.511467\", \"longitude\": \"72.447179\", \"bearing\": \"1.000000\", \"speed\": \"1.000000\", \"device_status\": 1, \"timestamp\": \"2013-08-18 00:00:00\"}]

告诉我们该字符串包含\"。如果将该事物分配给var,

var k = "[{...\"..}]"
console.log(k);
>>> [{..."...}]

然后你明确地解决了这个问题,因为那些\"会在你的字符串中变成"。如果你直接将输出传递给JSON.parse,那么输入中有一百万个斜杠,使其成为非法的JSON。

如果这是服务器生成的,请修复生成器。它不应该为你逃脱该字符串。如果你没有这种奢侈品,那就换一个字符串了。

var u = currentTrackData...;
u = u.replace(/\\"/g, '"');
JSON.parse(u);