我一直在试图找出一个在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格式的数据。

任何建议都将不胜感激。


当前回答

解决方案1(非常危险)

你可以简单地使用python的eval函数。

parsed_json = eval(your_json)

方案2(无风险)

你可以使用python默认包含的ast库,它也可以安全地计算表达式。

import ast

parsed_json = ast.literal_eval(your_json)

其他回答

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

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

使用eval函数。

它处理单引号和双引号之间的差异。

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

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

 “  ”  ‛  ’  ‘  `  ´  ″  ′ 

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

import re

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

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

json_object = json.loads(parsed_string)

JSON字符串必须使用双引号。JSON python库强制这样做,所以你无法加载你的字符串。你的数据应该是这样的:

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

如果这不是你能做到的,你可以使用ast.literal_eval()而不是json.loads()

我的问题是,我复制并粘贴了一个JSON片段,所使用的双引号在某种程度上是一个不同的、无法识别的双引号字符。我的文件在替换双引号后是有效的JSON。