JSON字符串双引号转义方法及解析报错问题排查
如何在JSON字符串中转义双引号?
咱们先把核心规则理清楚,避免再踩坑:
- 在JSON本身的语法里,字符串内部的双引号必须用
\来转义,也就是写成\",这样JSON解析器才会把它当成字符串的一部分,而不是结束标记。 - 但当你在JavaScript代码里写JSON字符串的时候,因为JavaScript本身会解析反斜杠(它是JS的转义字符),所以你得对反斜杠再转一次——用
\\来表示JSON里的单个\。
先说说你遇到的两个错误问题出在哪
- 第一个尝试里的
"是HTML实体,JSON根本不认识这种写法!你得把它换成实际的双引号"才行,HTML实体是给浏览器解析用的,和JSON完全不搭边。 - 第二个尝试
JSON.parse({"x":"Hello " test "})的问题在于:JavaScript模板字符串会先把\"解析成一个普通的双引号,结果传给JSON.parse的内容变成了{"x":"Hello " test "}——这明显语法炸了,中间的双引号直接打断了字符串,JSON解析器当然报错。
正确的写法看这里
用JS模板字符串的正确姿势:
要让JSON解析器拿到\",你得在模板字符串里写\\"(两个反斜杠+双引号),这样JS会把\\解析成单个\,最终传给JSON的就是正确的\":JSON.parse(`{"x":"Hello \\" test"}`)用单引号包裹JSON字符串更省心:
单引号字符串里的双引号不需要被JS转义,你只需要保证JSON本身的转义正确就行(也就是用\\表示JSON里的\):JSON.parse('{"x":"Hello \\" test"}')如果是处理带HTML实体的字符串:
比如你提到的Hello " test,得先把"替换成",再转义成JSON能识别的格式:const originalStr = 'Hello " test'; // 先替换HTML实体,再转义双引号 const escapedStr = originalStr.replace(/"/g, '\\"'); const jsonStr = `{"x":"${escapedStr}"}`; const result = JSON.parse(jsonStr); console.log(result.x); // 输出: Hello " test
最后再划个重点
别把HTML实体和JSON转义搞混,JSON只认\"这种转义方式;另外在JS里写JSON字符串时,记得给反斜杠多转一次,不然JS会偷偷吃掉一个反斜杠,导致JSON解析失败。
内容的提问来源于stack exchange,提问作者Reza




