【问题标题】:Python returned multiple JSONs as a string in PHPPython 在 PHP 中将多个 JSON 作为字符串返回
【发布时间】: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 现在改了

标签: python php json


【解决方案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>";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-31
    • 2014-11-30
    • 2021-10-23
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    相关资源
    最近更新 更多