2022-10-17 00:09:57
正确处理PHP与Python交互中的JSON数据传输需确保Python生成标准JSON、PHP透明转发并设置正确HTTP头,JavaScript端正确解析。 以下是具体步骤与关键点:
一、Python脚本生成标准JSON使用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字符串
适用场景:直接输出Python脚本结果,避免内存占用过高。
代码示例:<?phpif ($_GET['times'] == 0) { $command = escapeshellcmd('python3 feed.py ' . $_GET['subject']); header('Content-type: application/json'); // 设置响应头 passthru($command); // 直接传递Python输出}?>
适用场景:需捕获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(),否则会导致转义错误(如双引号被转义为")。
若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));
若未正确设置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字典的字符串表示)。
始终使用json.dumps()生成JSON字符串。
确保数据结构符合JSON规范(如用列表替代集合)。
透明转发数据,避免修改或二次编码。
优先使用passthru(),其次用shell_exec()+echo。
必须设置header('Content-type: application/json')。
优先使用Fetch API的.json()方法。
传统方法需手动调用JSON.parse(),但需确认响应为合法JSON字符串。
通过以上步骤,可实现PHP、Python与JavaScript间高效、可靠的数据传输,避免因格式错误导致的解析问题。