如何将PHP多维数组传递给Python并解析?解决JSON解码错误
PHP与Python跨语言传递多维数组的正确姿势(解决JSONDecodeError)
为什么会出现JSONDecodeError?
大概率是这几个原因:
- PHP生成的JSON里包含空格、引号这类shell特殊字符,直接通过
shell_exec传参时被shell解析破坏了结构 - SESSION里的多维数组有非UTF-8字符,导致
json_encode生成了无效JSON - Python接收数据时没处理好编码,或者拿到的内容有多余的换行/空白字符
正确实现步骤
1. PHP端:安全生成并传递JSON
先确保SESSION已经启动,然后处理数组转JSON,关键是用escapeshellarg把JSON包起来,避免shell搞破坏。
代码示例:
session_start(); // 先检查数据合法性 if (!isset($_SESSION['image']) || !is_array($_SESSION['image'])) { die("Invalid session data"); } // JSON编码,处理UTF-8问题,替换无效字符 $jsonData = json_encode($_SESSION['image'], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE); if ($jsonData === false) { die("JSON编码失败: " . json_last_error_msg()); } // 用escapeshellarg包裹,避免shell解析时破坏JSON结构 $escapedJson = escapeshellarg($jsonData); // 调用Python脚本,把处理后的JSON传进去 $pythonOutput = shell_exec("python3 your_script.py {$escapedJson}"); // 处理Python返回的结果 if ($pythonOutput === null) { die("执行Python脚本失败"); } echo $pythonOutput;
2. Python端:正确接收并解析
Python通过命令行参数拿到JSON字符串,直接用json.loads解析就行,记得加错误处理。
代码示例:
import json import sys def main(): # 检查有没有传参数 if len(sys.argv) < 2: print("错误:没有传入JSON数据", file=sys.stderr) sys.exit(1) # 取出传入的JSON字符串 json_str = sys.argv[1] try: # 解析JSON data = json.loads(json_str) # 这里写你的业务逻辑,比如打印数据或者处理多维数组 print("成功解析数据:") print(data) # 示例:访问多维数组的嵌套元素 # if 'foo' in data and 'bar' in data['foo']: # print(data['foo']['bar']) except json.JSONDecodeError as e: print(f"JSON解析错误:{str(e)}", file=sys.stderr) sys.exit(1) if __name__ == "__main__": main()
大数据场景:用标准输入传递
如果多维数组特别大,命令行参数可能有长度限制,改用标准输入传递更靠谱:
PHP端代码:
session_start(); $jsonData = json_encode($_SESSION['image'], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE); if ($jsonData === false) { die("JSON编码失败"); } // 用proc_open处理标准输入输出 $descriptorspec = [ 0 => ["pipe", "r"], // 标准输入 1 => ["pipe", "w"], // 标准输出 2 => ["pipe", "w"] // 标准错误 ]; $process = proc_open("python3 your_script.py", $descriptorspec, $pipes); if (!is_resource($process)) { die("无法启动Python进程"); } // 把JSON写入标准输入 fwrite($pipes[0], $jsonData); fclose($pipes[0]); // 读取输出和错误信息 $output = stream_get_contents($pipes[1]); $error = stream_get_contents($pipes[2]); fclose($pipes[1]); fclose($pipes[2]); $returnCode = proc_close($process); if ($returnCode !== 0) { die("Python脚本执行失败:" . $error); } echo $output;
Python端代码:
import json import sys def main(): try: # 从标准输入读取JSON内容 json_str = sys.stdin.read() data = json.loads(json_str) print("数据解析成功") # 这里写你的业务逻辑 except json.JSONDecodeError as e: print(f"解析错误:{str(e)}", file=sys.stderr) sys.exit(1) if __name__ == "__main__": main()
调试小技巧
- PHP端先打印
$jsonData,复制到在线JSON校验工具里确认格式是否正确 - 打印
$escapedJson,看JSON是否被正确转义(比如整个字符串被单引号包裹,内部的引号不会被shell解析) - Python端先打印
sys.argv[1](或sys.stdin.read())的原始内容,对比和PHP输出的JSON是否完全一致 - 检查PHP的
session_start()之前有没有输出任何内容(比如空格、换行),这会导致JSON前面多了无效字符
内容的提问来源于stack exchange,提问作者Jessen Jie
相关产品推荐
相关产品推荐

