我一直在试图找出一个在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片段,所使用的双引号在某种程度上是一个不同的、无法识别的双引号字符。我的文件在替换双引号后是有效的JSON。

其他回答

你输入的似乎是一个有效的(亚马逊)离子,虽然不是json。在这种情况下,您应该能够将其解析为ion,然后将其输出为json。

single_quote_json = {'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
    
import amazon.ion.simpleion as ion
from amazon.ion.json_encoder import IonToJSONEncoder

parsed_ion = ion.loads(str(single_quote_json))
json.dumps(parsed_ion, cls=IonToJSONEncoder)

输出:

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

参考:Amazon Ion上的文档:https://amzn.github.io/ion-docs/guides/cookbook.html#down-converting-to-json

我使用了这种方法,并设法获得了所需的输出。我的脚本

x = "{'inner-temperature': 31.73, 'outer-temperature': 28.38, 'keys-value': 0}"

x = x.replace("'", '"')
j = json.loads(x)
print(j['keys-value'])

输出

>>> 0

使用json.dumps()方法总是理想的。 为了消除这个错误,我使用了以下代码

json.dumps(YOUR_DICT_STRING).replace("'", '"')

如果你想将带有单引号的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