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

json_decode解析含反斜杠的外部JSON数据返回NULL如何解决

问题原因

解析失败的核心是收到的JSON不符合RFC 8259规范:标准JSON里反斜杠\只能作为转义符开头,后面仅允许跟随"、\、/、b、f、n、r、t、u构成合法转义序列,你收到的内容里\d属于非法转义,原生json_decode遇到这类格式问题会直接返回NULL。
另外你贴出的原始片段里存在"这类HTML实体,如果是直接从HTML上下文截取的内容,没先做实体解码也会导致解析失败。
你之前尝试的两个方法无效的原因很明确:

  • addslashes是PHP层面的字符串转义函数,只会给特定字符加PHP识别的转义符,不会修复JSON格式层面的非法转义问题,反而可能破坏原有JSON结构
  • 对未解析的异常字符串直接调用json_encode,会把整个内容编码为单个普通字符串值,无法得到你需要的对象/数组结构
可行解决方案

按以下步骤处理即可正常解析,不需要引入额外工具:

  1. 若原始内容带HTML实体,先做实体解码
  2. 用正则匹配所有不构成合法转义的孤立反斜杠,替换为JSON认可的转义反斜杠(即双反斜杠)
  3. 调用json_decode正常解析,可搭配错误检测排查剩余格式问题

对应代码如下:

// 传入你实际收到的原始内容
$raw = '{"publicKey": "D2Lxs7gD3cK2Yc+YxJL2iw\dawww1"}';
// 第一步:如果内容是从HTML页面提取、存在"这类HTML实体,先解码;如果是直接从HTTP请求体/接口报文拿到的原始内容,可跳过这一步
$raw = html_entity_decode($raw, ENT_QUOTES, 'UTF-8');
// 第二步:修复非法反斜杠转义,不会改动\n、\"这类合法转义序列
$fixedJson = preg_replace('/\\\(?![\"\\\/bfnrtu])/', '\\\\', $raw);
// 第三步:解析为关联数组,需要返回对象的话去掉第二个true参数即可
$result = json_decode($fixedJson, true);
// 可选:检测解析错误
if (json_last_error() !== JSON_ERROR_NONE) {
    // 此处可加日志记录错误信息
    echo '解析错误:' . json_last_error_msg();
}

解析后拿到的$result['publicKey']值就是D2Lxs7gD3cK2Yc+YxJL2iw\dawww1,和传入的原始公钥内容完全一致,不会丢失字符。

补充说明

如果你的PHP版本 >= 7.3,也可以尝试在调用json_decode时额外传入JSON_INVALID_UTF8_IGNORE常量组合,但对于明确存在非法转义的场景,上述正则修复的方案兼容性更好,不会漏处理孤立反斜杠的问题。

内容的提问来源于stack exchange,提问作者Semion Vino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:54:16