JSON中的单引号和双引号

Bin*_*hen 92 python json

我的代码:

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需要双引号用于其字符串.

  • 我说得太早了.显然它比那更复杂. (7认同)
  • #1无法在这里加载. (4认同)
  • 谢谢你的确认.显然我是唯一导入`str(dict)`的人,并且不想'评估'它.一个简单的`.replace("'",'"')`就可以了. (4认同)
  • 如果你需要使用双引号,你可以调用`json.dumps(..)`两次,如:`import json; d = dict(tags = ["dog","cat","mouse"]); print json.dumps(json.dumps(d))`它给出:`"{{"tags \":[\"dog \",\"cat \",\"mouse \"]}"` (4认同)
  • 但首先是JSON中的单引号,我很困惑.那个可以通过编译,但第二个不能. (2认同)

hah*_*ile 110

您可以使用 ast.literal_eval()

>>> import ast
>>> s = "{'username':'dfdsfdsf'}"
>>> ast.literal_eval(s)
{'username': 'dfdsfdsf'}
Run Code Online (Sandbox Code Playgroud)

  • 我最喜欢这个答案:您通常没有选择:如果有人给您单引号,您就会得到单引号。json.loads需要一个额外的参数,或者您应该使用此参数。全局替换“'”是一场灾难,就像传入的数据是:`{'a':'这个“字符串”确实不是!!!!” }` (6认同)
  • 这对我来说似乎是一个安全风险。 (2认同)
  • ``ast.literal_eval`` 不是安全风险,它的 ``eval`` 才是。 (2认同)

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)

  • 这是错误的方式.你正在将python数据结构序列化为JSON; 最初的问题是将JSON反序列化为python数据结构. (7认同)
  • 我的想法是用json.dumps将python序列化为json,然后当它处于str形式时调用json.loads. (4认同)
  • 你错过了这里的理解.如果你想加载json字符串,它必须是双引号.你正在做的仍然是转储json,而不是json字符串. (3认同)
  • 不确定原来的问题,但这确实帮助我在将 JSON 数据插入 SQL Server 之前用双引号正确翻译 JSON 数据,以允许有效的 JSON 解析。谢谢! (2认同)

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它会更好地匹配并且更快.

  • `demjson.decode`是受损json的一个很好的工具 - 但对于涉及数十或数十万个json数据包的任务,`ast.literal_eval`要快得多.不是说`demjson`没有它的位置:我将它用作后备,以防更快的方法失败. (4认同)

rob*_*nch 6

你可以这样修复它:

s = "{'username':'dfdsfdsf'}"
j = eval(s)
Run Code Online (Sandbox Code Playgroud)

  • 使用 ast.literal_eval 而不是 eval 来帮助避免注入攻击 (7认同)
  • **[请不要使用此](/sf/ask/128305831/)。这是一个安全风险。** (3认同)