当字符串中有单引号的时候使用 JSON.parse 转化字符串为数组的时候会报错

2019-09-04 20:40:14 +08:00
 Hopetree

我有个调用接口的方法,但是我发现,当接口返回的数据类似如下这种:

window.baidu.sug({q:"slim 版本",p:true,s:["let\'s slim","slim 的中文是什么","super slim"]});

这个里面的"let\'s slim"会导致我将[....]这一段用正则提出出来转化成数组的时候报错,找了好久没有找到原因,感觉是跟单双引号嵌套有关,但是我不知道 js 怎么解决这个问题,这个地方还是转义符号,也不能算嵌套把,为啥还会报错?

下图是我的代码片段

下面是 console 打印的结果和报错

5492 次点击
所在节点    JavaScript
9 条回复
ysc3839
2019-09-04 20:47:25 +08:00
看一下错误信息那里的 at position
ReVanTis
2019-09-04 21:27:43 +08:00
我隐约觉得你如果把 \' 改成 \\' 应该能 parse 过。。。
shintendo
2019-09-04 21:51:57 +08:00
JSON 规定字符串用双引号,因此里面的单引号不需要转义,也<b>不允许转义</b>
ericgu1788
2019-09-04 21:54:34 +08:00
可以试试反引号
chendy
2019-09-04 21:56:59 +08:00
这里的单引号不需要转义,转义了反而会错
dallaslu
2019-09-04 21:58:13 +08:00
看 JSON.parse 的结果,应该是当成了 JSON.parse('["let\\\'s slim"]')
AlphaTr
2019-09-04 22:06:47 +08:00
看结构应该是个 jsonp 的接口,所以通常都是按照 jsonp 的方式来处理;正则匹配字符串反而复杂
shintendo
2019-09-04 22:12:54 +08:00
啰嗦两句,你这个字符串用字面量写出来的话,其实是"[\"let\\'s slim\"]"。这个字面量经过一次转义后变成你的字符串,里面的反斜杠和单引号是两个实实在在的字符,而不是一个“转义单引号”(否则 console.log 怎么会打出这个反斜杠呢)。

这两个字符送到 JSON 解析器里,JSON 先读到一个反斜杠,就期待下一个字符与它组成一个转义符(\n,\t 等等),而单引号不符合它的期待
momocraft
2019-09-05 09:10:59 +08:00
用正则解析上下文无关文法的必然现象

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/597998

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX