JSON 的单引号和双引号

我的代码:

import simplejson as json


s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)

#1的定义是错误的

#2的定义是正确的

我听说在 Python 中 单身人士引号是可以互换的,有人能给我解释一下吗?

264817 次浏览

JSON 语法 不是 Python 语法,JSON 的字符串需要双引号。

您可以通过以下方法转储带有双引号的 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)

你可以使用 ast.literal_eval()

>>> import ast
>>> s = "{'username':'dfdsfdsf'}"
>>> ast.literal_eval(s)
{'username': 'dfdsfdsf'}

Demjson 也是解决糟糕的 json 语法问题的一个很好的软件包:

pip install demjson

用法:

from demjson import decode
bad_json = "{'username':'dfdsfdsf'}"
python_dict = decode(bad_json)

编辑:

对于损坏的 json 来说,demjson.decode是一个很好的工具,但是当您处理大量的 json 数据时,ast.literal_eval是一个更好的匹配,并且速度更快。

如前所述,JSON 不是 Python 语法。您需要在 JSON 中使用双引号。它的创建者以使用严格的允许语法子集来减轻程序员的认知过载而闻名。


如果其中一个 JSON 字符串本身包含@Jiaro 指出的单引号,则下面的命令可能会失败。不要使用。留在这里作为不起作用的例子。

真的很有用知道 JSON 字符串中没有单引号。比如说,你从浏览器控制台或其他地方复制粘贴了它。然后,你就可以打字了

a = json.loads('very_long_json_string_pasted_here')

如果它也使用单引号,那么它可能会中断。

我最近遇到了一个非常类似的问题,我相信我的解决方案也会对你有用。我有一个文本文件,其中包含一个项目清单的形式:

["first item", 'the "Second" item', "thi'rd", 'some \\"hellish\\" \'quoted" item']

我想把上面的代码解析成一个 python 列表,但是我不喜欢 eval () ,因为我不能信任输入。我首先尝试使用 JSON,但它只接受双引号条目,因此我为这个特定的情况编写了自己的非常简单的 lexer (只需插入您自己的“ stringtoparse”,您将得到输出列表: ‘ item’)

#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

希望对某些人有用,好好享受吧!

import ast
answer = subprocess.check_output(PYTHON_ + command, shell=True).strip()
print(ast.literal_eval(answer.decode(UTF_)))

我没问题

你可以这样解决:

s = "{'username':'dfdsfdsf'}"
j = eval(s)

它真正解决了我的问题,使用 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)

到目前为止给出的答案有两个问题,例如,如果有一个流这样的非标准 JSON。因为那样的话,可能需要解释传入的字符串(而不是 Python 字典)。

第一期 -demjson: 使用 Python 3.7。+ 和使用 conda 我不能安装 demjson,因为它显然不支持 Python > 3.5目前。所以我需要一个简单的解决方案,例如 ast和/或 json.dumps

第二期-astjson.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 (字典) ,但是它并没有转换我们需要的内容。

你可以用

json.dumps(your_json, separators=(",", ":"))

你可以修复单引号的那个

import json
single_quote_dictioary = "{'username':'dfdsfdsf'}" #1
  

json.dumps(eval(single_quote_dictioary))