我的代码:
import simplejson as json
s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)
Run Code Online (Sandbox Code Playgroud)
#1
定义是错误的
#2
定义是对的
我听说在Python中单个双引号可以互换,有人能为我解释一下吗?
Ign*_*ams 148
JSON语法不是Python语法.JSON需要双引号用于其字符串.
hah*_*ile 110
您可以使用 ast.literal_eval()
>>> import ast
>>> s = "{'username':'dfdsfdsf'}"
>>> ast.literal_eval(s)
{'username': 'dfdsfdsf'}
Run Code Online (Sandbox Code Playgroud)
cow*_*kit 41
您可以使用双引号转储JSON:
import json
# mixing single and double quotes
data = {'jsonKey': 'jsonValue',"title": "hello world"}
# get string with all double quotes
json_string = json.dumps(data)
Run Code Online (Sandbox Code Playgroud)
Sie*_*ide 13
到目前为止给出的答案有两个问题,例如,如果一个流传输这样的非标准 JSON。因为那时可能必须解释传入的字符串(而不是 python 字典)。
问题 1 - demjson
:使用 Python 3.7.+ 并使用 conda 我无法安装 demjson,因为它目前不支持 Python > 3.5。所以我需要一个更简单的解决方案,例如ast
和/或json.dumps
.
问题 2 - ast
& json.dumps
:如果 JSON 既是单引号,又包含至少一个值中的字符串,而该字符串又包含单引号,我发现的唯一简单而实用的解决方案是同时应用两者:
在以下示例中,我们假设line
是传入的 JSON 字符串对象:
>>> line = str({'abc':'008565','name':'xyz','description':'can control TV\'s and more'})
Run Code Online (Sandbox Code Playgroud)
第 1 步:使用ast.literal_eval()
第 2步将传入的字符串转换为字典:将json.dumps
其应用于键和值的可靠转换,但不涉及值的内容:
>>> import ast
>>> import json
>>> print(json.dumps(ast.literal_eval(line)))
{"abc": "008565", "name": "xyz", "description": "can control TV's and more"}
Run Code Online (Sandbox Code Playgroud)
json.dumps
单独不会完成这项工作,因为它不解释 JSON,而只能看到字符串。类似于ast.literal_eval()
:虽然它正确解释了 JSON(字典),但它不会转换我们需要的内容。
Dhi*_*aTN 10
demjson也是解决json语法错误问题的好方法:
pip install demjson
Run Code Online (Sandbox Code Playgroud)
用法:
from demjson import decode
bad_json = "{'username':'dfdsfdsf'}"
python_dict = decode(bad_json)
Run Code Online (Sandbox Code Playgroud)
编辑:
demjson.decode
对于损坏的json来说,它是一个很棒的工具,但是当你处理大量的json数据时,ast.literal_eval
它会更好地匹配并且更快.
你可以这样修复它:
s = "{'username':'dfdsfdsf'}"
j = eval(s)
Run Code Online (Sandbox Code Playgroud)