<?php
$jsonStr = '{
"ComputerName":"SDBG-IT",
"Serial":"MQ91111KGL",
"Version":"macOS 15.6.1",
"wired_mac":"76:c7:31:09:a4:4c",
"wireless_mac":"50:a6:d8:e4:25:87",
"curr_user":"bbbb",
"keyword_file":"/Users/bbbb/aa AAAA .pdf<br/>/Users/bbbb/aa AAAA^!.pdf<br/>/Users/bbbb/Desktop/BBBB@!.ppt<br/>/Users/bbbb/Desktop/BBBB@\".ppt<br/>/Users/bbbb/n237.pdf<br/>/Users/bbbb/BBBB.pptx<br/>/Users/bbbb/BBBB.ppt<br/>"
}';
$data = json_decode($jsonStr, true);
// 检查是否解析失败
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON 错误: " . json_last_error_msg();
exit;
}
print_r($data);
当 $jsonStr 内的 aa AAAA\\^!.pdf 时,就解析错误,解析失败,当 $jsonStr 内的 aa AAAA\\\^!.pdf 时解析正确,为什么
你这个 $jsonStr
不是你自己 json_encode()
出来的,而是 从另一台电脑上传过来的原始 JSON 串。
所以问题是:
🔑 建议解决方法
方法 1:对输入做预处理,修复非法反斜杠
把那些 JSON 不认识的转义(\^
、\@
等)改成 \\^
、\\@
,让 JSON 能正确解析。
示例: 下面是简略的原理, 最重要的是红色的字那一行
<?php
// 原始数据(另一台机器传过来的)
$jsonStr = '{"keyword_file":"/Users/bbbb/aa AAAA\\^!.pdf"}';
// 尝试解析
$data = json_decode($jsonStr, true);
if (json_last_error() !== JSON_ERROR_NONE) {
// 修复非法转义:把 \ 后面不是有效 JSON 转义字符的地方,替换成双反斜杠
$fixed= preg_replace('/\\\\(?!["\\\\\/bfnrtu])/', '\\\\\\\\', $jsonStr);
$data = json_decode($fixed, true);
}
print_r($data);
这样即使对方传了 \^
,我们会自动修复成 \\^
,JSON 就能正常解码。
方法 2:要求对方用 json_encode
如果你能改另一台电脑的代码,最好的办法是:
生成数据时用 json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
这样就不会产生非法的 \^
,也不会再出现解析失败的问题。
👉 问题本质:
json_decode()
严格遵守 JSON 标准,而标准里 \^
并不是合法转义。
所以要么修复输入,要么保证对方生成的 JSON 符合标准。
要不要我帮你写一个 通用函数,可以接收这种“可能带非法反斜杠的 JSON 字符串”,自动修复后再 json_decode()
?