JSON处理含双引号字符串时解析报错及eval使用异常如何解决?
问题根因
- 所有报错的核心是转义符双重消费冲突:
JSON.stringify输出的JSON字符串中用于转义双引号的\,会先被外层JS字符串字面量的解析规则提前消费,最终传入JSON.parse的内容丢失转义符,格式非法。 - 你遇到的几个场景都是同一逻辑:
JSON.stringify(['"d"'])输出的原始JSON为["\"d\""],当它被嵌入单引号包裹的JS字符串时,\"会被JS直接解析为普通双引号,最终传入JSON.parse的内容变为[""d""],触发语法错误。 - 直接赋值
var someJson='["\"d\""]'时的自动修改也是同理:JS字符串字面量的转义规则会先消费掉\,变量实际存储的内容没有转义符,自然无法被JSON.parse识别。
修复方案
可修改第三方库代码时
直接删除无意义的eval套娃逻辑,JSON.stringify返回的是合法JSON字符串,直接调用JSON.parse即可还原原对象:
// 替换原有错误逻辑 // window.eval(`JSON.parse('${JSON.stringify(t)}')`) // 改为 const res = JSON.parse(JSON.stringify(t))
如果必须保留eval写法,不要将JSON字符串包裹在单/双引号中传递,可利用JSON本身是合法JS字面量的特性直接解析,或对JSON做二次转义:
// 方案1:直接解析合法JS字面量 const res = window.eval(JSON.stringify(t)) // 方案2:二次转义后再传入JSON.parse const res = window.eval(`JSON.parse(${JSON.stringify(JSON.stringify(t))})`)
不可修改第三方库代码时
对入参t中的字符串做二次转义,抵消eval的转义消费:
// 处理入参中的所有字符串 const processedT = t.map(item => typeof item === 'string' ? item.replaceAll('"', '\\"') : item) // 传入第三方库调用 thirdPartyFunc(processedT)
临时测试快速修复
如果只是需要快速测试单一场景,给转义符额外加一层转义即可,或用String.raw避免JS提前消费转义符:
// 原错误写法 JSON.parse('["\"d\""]') // 修复方案1:额外加转义 JSON.parse('[\\"\\\\\\"d\\\\\\"\\"]') // 修复方案2:用String.raw JSON.parse(String.raw`["\"d\""]`)
内容的提问来源于stack exchange,提问作者Mikhail Tatarkov
相关产品推荐
相关产品推荐

