0

0

Python与PHP交互:正确传递JSON数组的实践指南

心靈之曲

心靈之曲

发布时间:2025-11-28 13:05:02

|

405人浏览过

|

来源于php中文网

原创

Python与PHP交互:正确传递JSON数组的实践指南

本教程旨在解决python脚本向php返回多条json数据时遇到的常见问题。通过优化python脚本,将所有数据封装成一个完整的json数组输出,并在php端进行两阶段解码,即先解码整体json数组,再循环解码数组中的每个json字符串为关联数组,确保数据结构清晰、易于处理。

在开发Web应用时,我们经常需要利用Python处理复杂逻辑或数据,并通过PHP前端来调用并展示结果。一个常见的场景是Python脚本生成多条数据记录,每条记录以JSON格式表示,然后将其返回给PHP。然而,如果Python脚本只是简单地在循环中打印每个JSON对象,PHP接收到的将是一个由多个JSON字符串拼接而成的非标准字符串,导致PHP的json_decode函数无法正确解析。

问题分析

原始的问题在于Python脚本在循环内部多次调用print(json.dumps(data)),导致每次迭代都输出一个独立的JSON字符串。当PHP通过shell_exec捕获这些输出时,它们被连接成一个单一的长字符串,例如:

{"key": "SWAT-107", "assignee": "Unassigned"} {"key": "SWAT-98", "assignee": "Unassigned"} ...

这个字符串不是一个有效的JSON数组或对象,因此PHP的json_decode无法将其解析为一个可操作的数据结构。即使尝试将Python输出改为一个包含JSON字符串的Python列表,PHP接收到的仍然是一个字符串表示的列表,例如['{"key": ...}', '{"key": ...}'],这也不是一个标准的JSON格式。

解决方案:Python端的优化

解决此问题的关键在于确保Python脚本的最终输出是一个完整且标准的JSON结构,通常是一个JSON数组。这意味着我们需要在Python脚本中收集所有要返回的数据,然后一次性将整个数据结构序列化为JSON字符串并打印出来。

立即学习PHP免费学习笔记(深入)”;

具体步骤如下:

  1. 创建一个空列表:用于存储每个数据项(字典)。
  2. 在循环中构建字典并添加到列表:将每个数据项(如Jira问题信息)构建成一个Python字典,然后使用json.dumps()将其序列化为JSON字符串,并添加到预先创建的列表中。
  3. 循环结束后,序列化整个列表并打印:在循环外部,将包含所有JSON字符串的列表再次使用json.dumps()序列化。这将生成一个标准的JSON数组字符串,其中每个元素都是一个JSON字符串。

以下是优化后的Python脚本示例:

医真AI+开放平台
医真AI+开放平台

医真AI+ 医学AI开放平台

下载
import json
# 假设 Jira 类和 get_fields, get_jql_search_issues 方法已定义
# from PyJira.Jira import Jira 

if __name__ == "__main__":
    # jira = Jira() # 假设 Jira 实例已创建
    output_data_list = [] # 用于存储所有数据字典的列表

    # 模拟获取Jira问题数据
    # fields = jira.get_fields()
    # jql_issues = jira.get_jql_search_issues(jql_search="project = SWAT AND resolution = Unresolved ORDER BY priority DESC, updated DESC")

    # 模拟一些问题数据
    jql_issues = [
        type('obj', (object,), {'key': 'SWAT-107', 'fields': type('obj', (object,), {'assignee': type('obj', (object,), {'display_name': 'Unassigned'})})})(),
        type('obj', (object,), {'key': 'SWAT-98', 'fields': type('obj', (object,), {'assignee': type('obj', (object,), {'display_name': 'Unassigned'})})})(),
        type('obj', (object,), {'key': 'SWAT-100', 'fields': type('obj', (object,), {'assignee': type('obj', (object,), {'display_name': 'Admin'})})})(),
    ]

    for issue in jql_issues:
        data_item = {}
        data_item['key'] = issue.key
        # 假设 assignee 字段可能为空
        assignee_name = issue.fields.assignee.display_name if issue.fields.assignee else "Unassigned"
        data_item['assignee'] = assignee_name
        output_data_list.append(data_item) # 将字典添加到列表

    # 将整个列表序列化为JSON数组字符串并打印
    print(json.dumps(output_data_list))
    # exit() # 通常不需要在脚本末尾显式调用 exit()

现在,Python脚本的输出将是一个标准的JSON数组,例如:

[{"key": "SWAT-107", "assignee": "Unassigned"}, {"key": "SWAT-98", "assignee": "Unassigned"}, {"key": "SWAT-100", "assignee": "Admin"}]

PHP端的处理

当Python脚本按照上述方式优化后,PHP通过shell_exec接收到的将是一个有效的JSON数组字符串。PHP端的处理将分为两个阶段:

  1. 第一次解码:使用json_decode将整个JSON数组字符串解码为PHP数组。此时,数组中的每个元素将是PHP对象(如果JSON中的元素是对象)或字符串(如果JSON中的元素是字符串)。
  2. 第二次解码(循环内):遍历第一次解码得到的数组。由于Python的输出是一个JSON数组,其中每个元素是包含具体数据的JSON对象。因此,PHP第一次解码后得到的是一个包含PHP对象的数组。我们需要在循环中再次对每个PHP对象进行解码,并使用true参数将其转换为关联数组,以便通过键名访问数据。

以下是PHP端的处理示例:

Jira Issues:";
foreach ($decoded_output as $jira_item_object) {
    // 第二次解码:将每个PHP对象(代表一个Jira问题)转换为关联数组
    // 'true' 参数确保将对象转换为关联数组
    $jira_data = (array) $jira_item_object; // 或者 json_decode(json_encode($jira_item_object), true); 更通用但稍慢

    // 检查是否成功转换为数组且包含预期的键
    if (is_array($jira_data) && isset($jira_data['key']) && isset($jira_data['assignee'])) {
        echo "Key: " . htmlspecialchars($jira_data['key']) . " - Assignee: " . htmlspecialchars($jira_data['assignee']) . "
"; } else { echo "Invalid item structure encountered.
"; } } ?>

代码说明:

  • shell_exec($python_script_command):执行Python脚本并捕获其标准输出。
  • json_decode($output_json_string):将Python脚本输出的JSON数组字符串解码为PHP数组。此时,$decoded_output将是一个包含PHP标准对象的数组。
  • foreach ($decoded_output as $jira_item_object):遍历这个PHP数组。$jira_item_object在每次迭代中都是一个PHP标准对象,代表一个Jira问题。
  • $jira_data = (array) $jira_item_object;:这是将PHP标准对象快速转换为关联数组的简洁方式。如果对象结构复杂或包含嵌套对象,更稳健的方法是json_decode(json_encode($jira_item_object), true);,它会先将PHP对象编码回JSON字符串,再解码为关联数组。
  • htmlspecialchars():用于在HTML输出中转义特殊字符,防止XSS攻击。

注意事项与总结

  1. 单一JSON结构原则:无论是从Python返回给PHP,还是在任何API通信中,始终确保通信的载体是一个单一、完整且符合JSON规范的结构(一个JSON对象或一个JSON数组)。避免输出多个独立的JSON片段。
  2. PHP json_decode 的 true 参数:当json_decode的第二个参数设置为true时,它会将JSON对象解码为PHP关联数组,而不是默认的PHP标准对象。这在访问数据时通常更为方便,例如$data['key']而非$data->key。
  3. 错误处理:在实际应用中,务必对shell_exec的返回值和json_decode的结果进行充分的错误检查。例如,检查shell_exec是否返回null或false,以及json_last_error()和json_last_error_msg()来判断JSON解码是否成功。
  4. 环境配置:确保PHP执行环境能够正确找到并运行Python脚本,包括Python解释器、虚拟环境(如pipenv)以及所有必要的Python库。
  5. 安全性:如果Python脚本的输入来源于用户,请务必进行输入验证和清理,防止命令注入等安全漏洞。

通过遵循这些实践,您可以有效地在Python和PHP之间传递复杂的JSON数据结构,实现健壮可靠的跨语言通信。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

758

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

639

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

761

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1264

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

548

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

708

2023.08.11

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 7.4万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号