我一直在试图找出一个在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模块的无效引号字符。
在我的情况下,我继续得到ValueError,即使在替换'与'在我的字符串。我最终意识到,一些类似引号的unicode符号已经进入了我的字符串:
“ ” ‛ ’ ‘ ` ´ ″ ′
要清除所有这些,你可以通过一个正则表达式传递你的字符串:
import re
raw_string = '{“key”:“value”}'
parsed_string = re.sub(r"[“|”|‛|’|‘|`|´|″|′|']", '"', my_string)
json_object = json.loads(parsed_string)
这样的:
{
'http://example.org/about': {
'http://purl.org/dc/terms/title': [
{'type': 'literal', 'value': "Anna's Homepage"}
]
}
}
不是JSON。
这样的:
{
"http://example.org/about": {
"http://purl.org/dc/terms/title": [
{"type": "literal", "value": "Anna's Homepage"}
]
}
}
是JSON。
编辑:
一些评论者认为,上述内容还不够。
JSON规范- RFC7159规定字符串以引号开始和结束。这就是“。
单引号在JSON中没有语义意义,只允许在字符串中使用。
因为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