PHP中json_decode解析Python脚本JSON返回null及后续报错问题
问题解决指南
1. 最初json_decode返回null的排查与修复
当json_decode($json)返回null时,90%的原因是$json的内容不是合法的JSON格式,你可以按以下步骤定位问题:
- 先看原始输出:在
json_decode前加一行var_dump($json); die;,看看拿到的是不是纯JSON——有没有多余的换行、Python警告、调试print语句输出?这些都会让JSON格式失效。 - 捕获Python的错误信息:
shell_exec默认只抓标准输出(stdout),把错误输出(stderr)重定向过来,就能看到Python脚本有没有报错:$json = shell_exec("C:/Users/1/AppData/Local/Programs/Python/Python36-32/python -W ignore ../../../interprises_parsers/parsers/tax/parser.py ".$bin." 2>&1"); var_dump($json); // 这里就能看到Python的错误或警告了 - 确保Python只输出JSON:检查你的Python脚本,删掉所有调试用的
print(),确保最终只输出一段干净的JSON——比如用json.dump(data, sys.stdout)直接输出,或者print(json.dumps(data), end='')避免多余换行。
2. 更新后:返回对象时的响应错误
你遇到的The Response content must be a string or object implementing __toString(), "object" given.错误,是因为框架(看起来像Laravel)不支持直接返回原生stdClass对象。解决起来很简单:
- 用框架的JSON响应方法包装对象返回:
$json = shell_exec("C:/Users/1/AppData/Local/Programs/Python/Python36-32/python -W ignore ../../../interprises_parsers/parsers/tax/parser.py ".$bin); $output = json_decode($json); return response()->json($output); // 把对象转成合法的JSON响应
另外,从你提供的var_dump结果看,输出里同时有stdClass对象和重复的JSON字符串,这说明Python脚本大概率输出了两次JSON内容,或者控制器里有多余的echo/print操作。你需要:
- 检查Python脚本,确保只调用一次输出JSON的代码;
- 检查控制器,除了
return语句外,有没有额外的输出代码。
内容的提问来源于stack exchange,提问作者A.Dias
相关产品推荐
相关产品推荐

