
PHP 的 json_decode() 无法解析含非法反斜杠(如 d)的 JSON 字符串,因其违反 JSON 规范;需在解码前将裸反斜杠 \ 统一替换为双反斜杠 \\,使其符合 JSON 转义语法。
php 的 `json_decode()` 无法解析含非法反斜杠(如 `d`)的 json 字符串,因其违反 json 规范;需在解码前将裸反斜杠 `\` 统一替换为双反斜杠 `\\`,使其符合 json 转义语法。
当外部系统(非你控制)返回类似以下 JSON 数据时:
{"publicKey": "D2Lxs7gD3cK2Yc+YxJL2iwdawww1"}json_decode() 会直接返回 null,因为 d 是非法转义序列——JSON 标准仅允许特定转义(如
、 、"、\ 等),而 d 无定义,导致解析失败。
✅ 正确解决方案是:预处理字符串,将所有孤立的反斜杠 替换为合法的双反斜杠 \(即 PHP 字符串中写为 '\',最终生成 JSON 中的 ):
$json = '{"publicKey": "D2Lxs7gD3cK2Yc+YxJL2iwdawww1"}';
// 将每个 替换为 \
$fixedJson = str_replace('\', '\\', $json);
$result = json_decode($fixedJson, true);
if ($result === null && json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('JSON decode failed: ' . json_last_error_msg());
}
echo $result['publicKey']; // 输出: D2Lxs7gD3cK2Yc+YxJL2iwdawww1⚠️ 注意事项:
-
str_replace('\', '\\', $json)是关键步骤:第一个参数'\'表示匹配单个反斜杠(PHP 字符串中需用两个反斜杠表示一个字面量),第二个参数'\\'表示替换为两个反斜杠(即 JSON 中合法的\); - 不要使用
addslashes()或json_encode()预处理原始 JSON 字符串——这会破坏 JSON 结构,导致嵌套错误; - 建议始终配合
json_last_error()或json_last_error_msg()进行错误诊断,避免静默失败; - 若数据中存在其他非法转义(如
z、q),该方法同样适用——统一转义可覆盖所有非法X模式。
? 总结:面对不可控的外部 JSON 输入,安全解码的核心是「先规范化转义,再标准解析」。str_replace('\', '\\', $json) 是轻量、可靠且符合 JSON 规范的预处理手段,适用于所有 PHP 版本(5.2+),无需额外依赖。


















