Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP->;Python JSON问题_Php_Python_Json_Python 3.x - Fatal编程技术网

PHP->;Python JSON问题

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

我做错了什么?蟒蛇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 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()一起接收。