You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析含特殊字符的JSON?PHP转译后JS解析报错求助

解析含特殊字符的JSON:解决控制字符导致的SyntaxError

首先,咱们得搞清楚为什么会报错——问题出在那个\b(退格符,ASCII 0x08)上。JSON规范里明确规定:字符串中的控制字符(像退格、换页这类ASCII 0-31范围内的字符,除了\t、\n、\r)必须经过转义才能合法存在。你现在的JS字符串里,\b被解析成了实际的退格字符,而不是JSON能识别的转义序列\\b,所以JSON.parse直接炸了。

下面分两种场景给你解决方案:

一、从PHP源头生成合法的JSON(最优解)

别等拿到JS里再修,从生成JSON的地方解决才是最靠谱的。PHP的json_encode函数默认会把ASCII控制字符转义成\uXXXX的格式(比如退格符会变成\u0008),这样生成的JSON本身就是合法的,JS直接解析就行。

检查你的PHP代码,确保是用json_encode直接生成JSON,而不是手动拼接字符串。举个正确的例子:

// 假设从数据库取出的文本是$originalText,包含退格符
$originalText = '推奨切削条件 ' . chr(8); // chr(8)就是退格符
$data = [
    'table1' => [
        ['Item' => ['original_text' => $originalText]]
    ]
];
// 生成合法JSON,退格符会被转义成\u0008
echo json_encode($data);

这样输出的JSON拿到JS里,直接JSON.parse就不会报错了。

二、如果只能在JS端修复(应急方案)

要是没法改PHP代码,那就在JS里先把非法的控制字符转成JSON认可的转义序列再解析。

针对退格符的快速修复

直接把字符串里的实际退格符替换成\\b:

var strData = '{"table1":[{"Item":{"original_text":"\u63a8\u5968\u5207\u524a\u6761\u4ef6 \b"}}]}';
// 先替换退格符为JSON转义序列
strData = strData.replace(/\b/g, "\\b");
// 再处理其他你需要的换行、回车、制表符
strData = strData.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t");
var jsonData = JSON.parse(strData); // 现在能正常解析了

更全面的控制字符处理

如果还有其他控制字符(比如换页符\f、空字符\x00等),可以用正则替换所有非法控制字符为\uXXXX格式:

var strData = '{"table1":[{"Item":{"original_text":"\u63a8\u5968\u5207\u524a\u6761\u4ef6 \b"}}]}';
// 替换所有ASCII控制字符(除了\t\n\r)为\uXXXX转义
strData = strData.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F]/g, function(char) {
    return "\\u" + ("0000" + char.charCodeAt(0).toString(16)).slice(-4);
});
var jsonData = JSON.parse(strData);

简单总结一下:JSON对字符串里的控制字符要求很严格,要么在生成时就转义好,要么在解析前把非法字符转成合法的转义序列,后者只是临时救急,优先从源头解决问题哦!

内容的提问来源于stack exchange,提问作者D T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:59:41