为何复制JSON.stringify输出到JSON.parse会报Unexpected token '错误?
这问题我之前也碰到过!根源其实是JSON的语法规则比JS对象字面量严格得多——JSON要求所有的键名和字符串值必须用双引号包裹,而你手动复制粘贴的字符串里用了单引号,这就违反了JSON规范,所以JSON.parse直接报错了。
为什么正常代码能运行?
你用JSON.stringify(employee)生成的字符串,是完全符合JSON语法标准的——它会自动把所有的引号转换成双引号,同时处理好其他JSON语法细节,所以后续用JSON.parse解析自然不会有问题。
报错代码的问题点
看你这段报错的代码:
const person = JSON.parse("{'id':0,'firstName':'Andy','subordinates':[{'id':1,'firstName':'James','subordinates':[{'id':3,'firstName':'Aubrey','subordinates':null}]},{'id':2,'firstName':'Collin','subordinates':null}]}");
这里面的'id'、'Andy'都是单引号,JSON解析器根本不认可单引号作为字符串或键名的包裹符,所以在解析的第1个位置就碰到了非法的'字符,直接抛出错误。
解决办法
- 手动修正引号:把JSON字符串里所有的单引号换成双引号,同时注意外层可以用单引号或者反引号来包裹整个JSON串,避免和内部的双引号冲突:
// 外层用单引号,内部双引号 const person = JSON.parse('{"id":0,"firstName":"Andy","subordinates":[{"id":1,"firstName":"James","subordinates":[{"id":3,"firstName":"Aubrey","subordinates":null}]},{"id":2,"firstName":"Collin","subordinates":null}]}'); // 或者外层用反引号 const person = JSON.parse(`{"id":0,"firstName":"Andy","subordinates":[{"id":1,"firstName":"James","subordinates":[{"id":3,"firstName":"Aubrey","subordinates":null}]},{"id":2,"firstName":"Collin","subordinates":null}]}`);
- 避免手动复制:最稳妥的方式还是像你正常代码那样,直接使用
JSON.stringify的输出结果,不要手动复制粘贴后再修改——毕竟手动操作很容易不小心引入不符合JSON规范的语法,比如单引号、多余的逗号之类的。
额外提醒:JSON和JS对象字面量的关键区别
- JSON的键必须用双引号,JS对象字面量的键可以不用引号,或者用单/双引号
- JSON的字符串只能用双引号,JS字符串可以用单/双/反引号
- JSON不支持
undefined、函数、Symbol等JS特有的类型,JSON.stringify会把这些类型忽略或者转成null - JSON不允许末尾有多余的逗号(trailing commas),JS对象字面量在现代浏览器里允许
内容的提问来源于stack exchange,提问作者PositiveGuy
相关产品推荐
相关产品推荐

