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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:45:47