我的代码:
import simplejson as json
s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)
#1
定义错误
#2
定义是对的
我听说在Python中单个双引号可以互换,有人能为我解释一下吗?
答案 0 :(得分:137)
JSON syntax不是Python语法。 JSON需要双引号用于其字符串。
答案 1 :(得分:94)
您可以使用ast.literal_eval()
>>> import ast
>>> s = "{'username':'dfdsfdsf'}"
>>> ast.literal_eval(s)
{'username': 'dfdsfdsf'}
答案 2 :(得分:38)
您可以使用双引号转储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)
答案 3 :(得分:10)
demjson也是解决json语法错误问题的好方法:
pip install demjson
<强>用法:强>
from demjson import decode
bad_json = "{'username':'dfdsfdsf'}"
python_dict = decode(bad_json)
修改强>
demjson.decode
对于受损的json来说是一个很棒的工具,但是当你处理大量的json数据时ast.literal_eval
是一个更好的匹配并且更快。
答案 4 :(得分:8)
到目前为止,给出了两个问题的答案,例如,如果一个流这样的非标准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'})
第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"}
仅 json.dumps
不能完成此工作,因为它不解释JSON,而只能看到字符串。与ast.literal_eval()
类似:尽管它可以正确解释JSON(字典),但不会转换所需的内容。
答案 5 :(得分:2)
如上所述,JSON不是Python语法。您需要在JSON中使用双引号。它的创建者(in-)以使用允许语法的严格子集来缓解程序员的认知过载而闻名。
如果其中一个JSON字符串本身包含@Jiaaro指出的单引号,则下面会失败。不使用。留在这里作为不起作用的例子。
非常有用知道JSON字符串中没有单引号。比如说,您从浏览器控制台/其他任何地方复制并粘贴它。然后,您只需输入
即可a = json.loads('very_long_json_string_pasted_here')
如果它也使用单引号,则可能会中断。
答案 6 :(得分:1)
我最近遇到了一个非常类似的问题,并且相信我的解决方案也可以为您服务。我有一个文本文件,其中包含以下形式的项目列表:
["first item", 'the "Second" item', "thi'rd", 'some \\"hellish\\" \'quoted" item']
我想将上面的内容解析为一个python列表,但是由于我不信任输入内容,所以对eval()并不热衷。我首先尝试使用JSON,但是它只接受双引号,因此我针对这种情况编写了自己的非常简单的词法分析器(只需插入自己的“ stringtoparse”,您将获得输出列表:“ items”)
#This lexer takes a JSON-like 'array' string and converts single-quoted array items into escaped double-quoted items,
#then puts the 'array' into a python list
#Issues such as ["item 1", '","item 2 including those double quotes":"', "item 3"] are resolved with this lexer
items = [] #List of lexed items
item = "" #Current item container
dq = True #Double-quotes active (False->single quotes active)
bs = 0 #backslash counter
in_item = False #True if currently lexing an item within the quotes (False if outside the quotes; ie comma and whitespace)
for c in stringtoparse[1:-1]: #Assuming encasement by brackets
if c=="\\": #if there are backslashes, count them! Odd numbers escape the quotes...
bs = bs + 1
continue
if (dq and c=='"') or (not dq and c=="'"): #quote matched at start/end of an item
if bs & 1==1: #if escaped quote, ignore as it must be part of the item
continue
else: #not escaped quote - toggle in_item
in_item = not in_item
if item!="": #if item not empty, we must be at the end
items += [item] #so add it to the list of items
item = "" #and reset for the next item
continue
if not in_item: #toggle of single/double quotes to enclose items
if dq and c=="'":
dq = False
in_item = True
elif not dq and c=='"':
dq = True
in_item = True
continue
if in_item: #character is part of an item, append it to the item
if not dq and c=='"': #if we are using single quotes
item += bs * "\\" + "\"" #escape double quotes for JSON
else:
item += bs * "\\" + c
bs = 0
continue
希望对某些人有用。享受吧!
答案 7 :(得分:1)
您可以通过以下方式解决它:
s = "{'username':'dfdsfdsf'}"
j = eval(s)
答案 8 :(得分:1)
你可以使用
json.dumps(your_json, separators=(",", ":"))
答案 9 :(得分:0)
import ast
answer = subprocess.check_output(PYTHON_ + command, shell=True).strip()
print(ast.literal_eval(answer.decode(UTF_)))
为我工作
答案 10 :(得分:0)
使用eval函数确实解决了我的问题。
single_quoted_dict_in_string = "{'key':'value', 'key2': 'value2'}"
desired_double_quoted_dict = eval(single_quoted_dict_in_string)
# Go ahead, now you can convert it into json easily
print(desired_double_quoted_dict)
答案 11 :(得分:-3)
import json
data = json.dumps(list)
print(data)
以上代码段应该可以使用。