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,然后对其进行解码。然后我有了数组,要得到keyassignee,我必须对其进行解码,并设置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 之类的库)

如何在 Django 中将 Http Post 参数的 Json 值转换为 Python 字典?

在swift 5中将json数据获取到tableview

php如何将逗号分隔的多个json格式的字符串作为一个值插入到mysql表中? [复制]