0
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)

语法错误:意外的令牌 \

然而

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

正常工作

4

2 回答 2

3

这是因为当它从服务器返回时,结果是以字符串形式存储的,所以字符串本身\在 every 之前包含转义字符"。转义"JSON 字符串中的字符是无效的。

就像这样做:

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

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

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

JSON.parse(json.replace(/\\"/g, '"'));
于 2013-09-07T20:47:41.587 回答
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);
于 2013-09-07T20:51:02.967 回答