PHP->;Python JSON问题
我做错了什么?蟒蛇3:PHP->;Python JSON问题,php,python,json,python-3.x,Php,Python,Json,Python 3.x,我做错了什么?蟒蛇3: >>> import json >>> s = "\"{'key': 'value'}\"" >>> obj = json.loads(s) >>> obj['key'] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: string indices must
>>> import json
>>> s = "\"{'key': 'value'}\""
>>> obj = json.loads(s)
>>> obj['key']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string indices must be integers
Python代码:
import json, sys
s = json.loads(sys.argv[1]) #fails already
import json, sys, ast
task = json.loads("\"" + sys.argv[1] + "\"")
task = ast.literal_eval(task)
sessionid = task['sessionid'] # DONE!:)
看看这个JSON:
"\"{'key': 'value'}\""
您有一个包含转义引号的字符串,后跟类似字典的对象,然后是转义引号。当您尝试解码此文件时,您将得到以下结果:
"{'key': 'value'}"
这是一个字符串,而不是字典。由于您的字符串被两个引号包围,您将其中一个引号转义,因此使用
json
读取字符串后,结果将是字符串,因此在此之后,您可以使用ast.literal\u eval
将字符串转换为字典:
>>> obj = json.loads(s)
>>> obj
"{'key': 'value'}"
>>> import ast
>>> new=ast.literal_eval(obj)
>>> new['key']
'value'
Kasra的回答是正确的,
ast
起到了作用,但是,另外,我必须用php“修复”我的字符串-以防止“损坏”(由shell?):
php代码:
$cmd = json_encode(['sessionid' => $session->getId(), 'file' => $filename]);
$cmd = str_replace('"', '\'', $cmd);
$cmd = str_replace('\\/', '/', $cmd);
$cmd = 'python3 program.py "' . $cmd . '"';
exec($cmd);
python代码:
import json, sys
s = json.loads(sys.argv[1]) #fails already
import json, sys, ast
task = json.loads("\"" + sys.argv[1] + "\"")
task = ast.literal_eval(task)
sessionid = task['sessionid'] # DONE!:)
如果没有此选项,
json.loads
将引发ValueError:应使用双引号括起属性名:第1行第2列(char 1)
,因为内部字符串不是json。JSON在键和值周围总是有双引号。是的!这样的JSON字符串是由phpI的JSON_encode()
生成的,phpI会在对象在PHP中序列化之前查看它。您需要这些引号是双引号,否则它是无效的语法。PHP:json\u encode(['sessionid'=>$session->getId(),'file'=>$filename])
--python脚本将其作为命令行参数与shell\u exec()一起接收。