正确处理PHP与Python交互中的JSON数据传输

正确处理PHP与Python交互中的JSON数据传输
最新回答
蓝雨希

2022-10-17 00:09:57

正确处理PHP与Python交互中的JSON数据传输需确保Python生成标准JSON、PHP透明转发并设置正确HTTP头,JavaScript端正确解析。 以下是具体步骤与关键点:

一、Python脚本生成标准JSON
  • 问题根源:Python直接输出字典的字符串表示(如print(out))或使用集合({}无键值对)会导致非标准JSON,JavaScript无法解析。
  • 解决方案

    使用json.dumps()序列化:将Python字典或列表转换为符合JSON规范的字符串。

    避免集合类型:JSON无集合概念,需用列表([])替代。

    示例修正:import jsonout = {"data": [], "status": 200}outnews = [ html.unescape(currentNews["timestamp"]), html.unescape(currentNews["title"]), html.unescape(currentNews["description"]), html.unescape(currentNews["link"])]out["data"].append(outnews)print(json.dumps(out)) # 输出标准JSON字符串

二、PHP脚本透明转发JSON
  • 核心原则:PHP不修改Python生成的JSON,仅传递数据并设置正确的HTTP头。
  • 方法1:使用passthru()(推荐)

    适用场景:直接输出Python脚本结果,避免内存占用过高。

    代码示例:<?phpif ($_GET['times'] == 0) { $command = escapeshellcmd('python3 feed.py ' . $_GET['subject']); header('Content-type: application/json'); // 设置响应头 passthru($command); // 直接传递Python输出}?>

  • 方法2:使用shell_exec()

    适用场景:需捕获Python输出进行简单处理(如日志记录)。

    代码示例:<?phpif ($_GET['times'] == 0) { $command = escapeshellcmd('python3 feed.py ' . $_GET['subject']); $output = shell_exec($command); // 获取JSON字符串 header('Content-type: application/json'); echo $output; // 直接输出}?>

  • 关键注意事项

    安全防护:使用escapeshellcmd()防止命令注入。

    避免二次编码:切勿对已生成的JSON字符串调用json_encode(),否则会导致转义错误(如双引号被转义为")。

三、JavaScript端正确解析JSON
  • 现代API(Fetch)

    若PHP设置Content-type: application/json,Fetch的.json()方法可自动解析响应体。

    示例代码:fetch('your_php_script.php?times=0&subject=example') .then(response => { if (!response.ok) throw new Error('Network error'); return response.json(); // 自动解析为JS对象 }) .then(data => console.log(data)) .catch(error => console.error('Error:', error));

  • 传统方法(XMLHttpRequest)

    若未正确设置HTTP头,需手动调用JSON.parse()。

    示例代码:const xhr = new XMLHttpRequest();xhr.open('GET', 'your_php_script.php?times=0&subject=example');xhr.onload = () => { const data = JSON.parse(xhr.responseText); // 手动解析 console.log(data);};xhr.send();

  • 常见错误规避

    勿对已解析的JS对象再次调用JSON.parse()。

    勿用JSON.stringify()“修复”非JSON字符串(如Python字典的字符串表示)。

四、总结与最佳实践
  • 数据源(Python)

    始终使用json.dumps()生成JSON字符串。

    确保数据结构符合JSON规范(如用列表替代集合)。

  • 中间层(PHP)

    透明转发数据,避免修改或二次编码。

    优先使用passthru(),其次用shell_exec()+echo。

    必须设置header('Content-type: application/json')。

  • 客户端(JavaScript)

    优先使用Fetch API的.json()方法。

    传统方法需手动调用JSON.parse(),但需确认响应为合法JSON字符串。

通过以上步骤,可实现PHP、Python与JavaScript间高效、可靠的数据传输,避免因格式错误导致的解析问题。