Python 在 PHP 中将多个 JSON 作为字符串返回
Posted
技术标签:
【中文标题】Python 在 PHP 中将多个 JSON 作为字符串返回【英文标题】:Python returned multiple JSONs as a string in PHP 【发布时间】:2022-01-19 13:38:51 【问题描述】:我在 python 中创建 JSON 数组并将其返回给 php 时遇到了一些麻烦。
现在我有一个 PHP 页面,它像这样调用 Python 脚本:
$output1 = shell_exec("cd .. && cd python/pyjira && pipenv run py PyJira/Jira.py");
var_dump($output1);
python 脚本创建一些 JSON 打印
if __name__ == "__main__":
jira = Jira()
data =
fields = jira.get_fields()
jql_issues = jira.get_jql_search_issues(jql_search="project = SWAT AND resolution = Unresolved ORDER BY priority DESC, updated DESC")
for issue in jql_issues:
data['key'] = issue.key
data['assignee'] = issue.fields.assignee.display_name
print(json.dumps(data))
exit
python 的输出
"key": "SWAT-107", "assignee": "Unassigned"
"key": "SWAT-98", "assignee": "Unassigned"
"key": "SWAT-100", "assignee": "Unassigned"
"key": "SWAT-97", "assignee": "Unassigned"
"key": "SWAT-75", "assignee": "Unassigned"
"key": "SWAT-129", "assignee": "Unassigned"
这是来自 PHP 的 var_dump(...);
,在这里您可以看到它是单个字符串中的多个 JSON
""key": "SWAT-107", "assignee": "Unassigned" "key": "SWAT-98", "assignee": "Unassigned" "key": "SWAT-100", "assignee": "Unassigned" "key": "SWAT-97", "assignee": "Unassigned" "key": "SWAT-75", "assignee": "Unassigned" "key": "SWAT-129", "assignee": "Unassigned" "
有没有办法让 python 一个一个地返回 JSON 对象,所以我可以在 PHP 中循环它们,然后只做data['key']
等?
我知道当我只有一个像 "key": "SWAT-107", "assignee": "Unassigned"
这样的 JSON 时,我只需要在 PHP 中 json_decode(...)_;
它。
更新
正如评论所建议的,我现在尝试从 python 返回一个数组,并在 PHP 网站上获取:
"['"key": "SWAT-106", "assignee": "Unassigned"', '"key": "SWAT-107", "assignee": "Unassigned"', '"key": "SWAT-98", "assignee": "Unassigned"', '"key": "SWAT-100", "assignee": "Unassigned"', '"key": "SWAT-97", "assignee": "Unassigned"', '"key": "SWAT-75", "assignee": "Unassigned"', '"key": "SWAT-129", "assignee": "Unassigned"'] "
我怎样才能把它变成一个数组?
【问题讨论】:
分别返回每个 JSON 对象需要做什么?现在它单独打印每个,每个之间都有一个换行符。你还想要什么? 为什么不返回一个 JSON 数组呢?["key": "somevalue", "assignee": "othervalue", "key": "value", "assignee": "anothervalue"]
。那你可以json_decode
就好了。
@mark_b 感谢您的建议,查看更新的字段,格式现在是一个数组,但它仍然是一个字符串,我该如何从 string->array
请勿发帖pictures of output,请以文字形式发帖。
@berend 现在改了
【参考方案1】:
对于你发布的更新之前的字符串,我想出了这个有点混乱的解决方案:
$string = '"test1": "1", "test2": "2" "test3": "3", "test4": "4" "test5": "5", "test6": "6"';
$array = explode(" ", $string);
foreach ($array as $k => $v)
if(substr($v, 0, 1) != "")
$array[$k] = "" . $v;
$finalArray = [];
foreach($array as $v)
$finalArray[] = json_decode($v);
我是在我的测试 $string 上完成的,这与你的类似,它为我创建了一个对象数组($finalArray)。
【讨论】:
感谢您的建议,但我找到了解决问题的方法,解决方法在 python 代码中结束。【参考方案2】:解决方案比我想象的要简单
如果我们从 python 开始,这就是问题所在。
首先(根据评论的建议)我将所有 JSON 数据放入一个数组中,使用 json.dump()
但在循环之外我使用 json.dump()
打印数组,这使得 PHP 知道 printet 变量是 JSON。
if __name__ == "__main__":
jira = Jira()
data =
output = []
fields = jira.get_fields()
jql_issues = jira.get_jql_search_issues(jql_search="project = SWAT AND resolution = Unresolved ORDER BY priority DESC, updated DESC")
for issue in jql_issues:
data['key'] = issue.key
data['assignee'] = issue.fields.assignee.display_name
output.append(json.dumps(data))
print(json.dumps(output))
exit
在我的 PHP 中,我只需调用 python 脚本并获取 JSON,然后对其进行解码。然后我有了数组,要得到key
和assignee
,我必须对其进行解码,并设置assosiative = TRUE
将对象转换为数组。
$output1 = shell_exec("cd .. && cd python/pyjira && pipenv run py PyJira/Jira.py");
// Display the list of all file
// and directory
$decoded_output = json_decode($output1);
for ($i=0; $i < count($decoded_output); $i++)
$jira_data = json_decode($decoded_output[$i], true); // 'true' to convert object to array
echo $jira_data['key'] . " - " . $jira_data['assignee'] . "<br>";
【讨论】:
以上是关于Python 在 PHP 中将多个 JSON 作为字符串返回的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中将 Json 对象字符串作为系统日志消息发送
如何在php rabbitmq中将完整对象作为消息从生产者发送到消费者
在 PHP 中将对象转换为 JSON 并将 JSON 转换为对象,(像 Gson for Java 之类的库)