欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

当 $jsonStr 内的 aa la7\\^!.pdf 时,就解析错误,解析失败,当 $jsonStr 内的 aa la7\\\^!.pdf 时解析正确,为什么 chatgpt 有大用 有大大用

<?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 串

所以问题是:

  • 另一台电脑在生成 JSON 的时候,可能 转义不标准,比如 \^ 这种在 JSON 里本来是不允许的。

  • 到你这里一旦遇到非法转义,json_decode() 就直接失败(返回 nulljson_last_error() 提示 Syntax error)。


🔑 建议解决方法

方法 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()


普通分类: