JSON.parse报Bad control character错误的原因及解决方法
问题原因
JSON语法规则明确要求:字符串中的控制字符(比如制表符、换行符这类不可见字符)不能直接存在,必须用转义序列(比如\t代表制表符)来表示。
你示例代码里的字符串s存在两个问题:
- 字符串中的
"asdf asdfdaf"包含了真实的制表符字符,而非JSON要求的\t转义格式; - 用了HTML实体
"代替双引号,这也不符合JSON的语法规范。
当JSON.parse解析时,遇到未转义的控制字符就会触发语法错误。
解决方案
方法一:手动构造合法的JSON字符串
如果是自己编写JSON字符串,需满足两个要求:
- 把真实的控制字符替换为JSON转义序列,同时在JavaScript字符串里转义反斜杠(即用
\\t代替真实制表符); - 直接使用双引号
",不要用HTML实体"。
示例代码:
let s = '{"adf":"asdf\\tasdfdaf"}'; JSON.parse(s); // 正常执行
这里的\\t在JavaScript中会被解析为\t,完全符合JSON对制表符的转义要求。
方法二:处理外部传入的非标准字符串
如果字符串是从外部获取的(比如接口返回、富文本内容),先做两步预处理再解析:
- 把HTML实体
"替换为真实的双引号"; - 把字符串里的控制字符(比如制表符、换行符)替换为JSON认可的转义序列。
示例代码:
let s = '{"adf":"asdf asdfdaf"}'; // 替换HTML实体为双引号 s = s.replace(/"/g, '"'); // 替换制表符为JSON转义序列,其他控制字符可扩展正则一起处理 s = s.replace(/[\t\n\r]/g, match => '\\' + match); JSON.parse(s); // 正常解析
内容的提问来源于stack exchange,提问作者ِAmin
相关产品推荐
相关产品推荐

