我一直在试图找出一个在Python中加载JSON对象的好方法。 我发送这个json数据:

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

到后端,它将作为一个字符串接收,然后我使用json.loads(数据)来解析它。

但每次我都得到相同的异常:

ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

我谷歌了一下,但似乎没有什么工作,除了这个解决方案json.loads(json.dumps(data)),这对我个人来说似乎不是那么有效,因为它接受任何类型的数据,甚至那些不是json格式的数据。

任何建议都将不胜感激。


当前回答

如果你想将带有单引号的json字符串转换为python dict,请使用ast.literaleval()

>>> import ast
>>> payload = "{'hello': 'world'}"
>>> ast.literal_eval(payload)
{'hello': 'world'}
>>> type(ast.literal_eval(payload))
<class 'dict'>

这将把有效负载转换为python字典。

其他回答

因为JSON只允许用双引号括住字符串,你可以这样操作字符串:

s = s.replace("\'", "\"")

如果你的JSON包含转义单引号(\'),那么你应该使用更精确的以下代码:

import re
p = re.compile('(?<!\\\\)\'')
s = p.sub('\"', s)

这将把JSON字符串s中出现的所有单引号替换为双引号,在后一种情况下,不会替换转义的单引号。

你也可以使用不那么严格的js-beautify:

$ pip install jsbeautifier
$ js-beautify file.js

正如其他答案所解释的那样,错误发生是因为传递给json模块的无效引号字符。

在我的情况下,我继续得到ValueError,即使在替换'与'在我的字符串。我最终意识到,一些类似引号的unicode符号已经进入了我的字符串:

 “  ”  ‛  ’  ‘  `  ´  ″  ′ 

要清除所有这些,你可以通过一个正则表达式传递你的字符串:

import re

raw_string = '{“key”:“value”}'

parsed_string = re.sub(r"[“|”|‛|’|‘|`|´|″|′|']", '"', my_string)

json_object = json.loads(parsed_string)

你可以使用json5包https://pypi.org/project/json5/而不是json包。这个包可以处理单引号。解码函数是json5.loads(data),类似于json包。

很简单,这个字符串不是有效的JSON。正如错误所示,JSON文档需要使用双引号。

您需要修复数据的来源。

我有同样的问题,我所做的是用双引号替换单引号,但更糟糕的是,当我有一个逗号的json对象的最后一个属性时,我有同样的错误。因此,在使用json.loads()函数之前,我使用python中的regex来替换它。(注意“loads”后面的s)

import re

with open("file.json", 'r') as f:
     s = f.read()
     correct_format = re.sub(", *\n *}", "}", s)
     data_json = json.loads(correct_format)

使用的正则表达式返回每个逗号后跟换行符和“}”,用“}”替换它。