我一直在试图找出一个在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。在这种情况下,您应该能够将其解析为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
我有这个错误试图规范化嵌套的JSON列在熊猫。正如@Reihan_amn所指出的,将所有单引号替换为双引号可能会影响实际内容。因此,当得到这个错误时,您应该只替换JSON语法中的“that are where”。你可以用下面的正则表达式来实现:
import re
import json
invalid_json = """{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}"""
valid_json = re.sub( "(?<={)\'|\'(?=})|(?<=\[)\'|\'(?=\])|\'(?=:)|(?<=: )\'|\'(?=,)|(?<=, )\'", "\"", invalid_json)
print(json.loads(valid_json))
如果唯一的问题是在原始格式错误的JSON文档中,双引号(")应该出现的地方出现了单引号('),那么这就足够了。但是,如果文档中的某个地方出现了双引号,而这些双引号也不是JSON语法的一部分,那么您仍然会得到一个错误。在这种情况下,我建议4步解决方案:
将所有作为JSON语法一部分的双引号替换为单引号(与上面的正则表达式类似,但交换了' and ')。
将所有(剩余的)双引号替换为文档中不存在的特殊字符,例如:' '。你可以用re.sub("\"", " ' ' ", x)。
使用上面给出的正则表达式,将JSON中应该是双引号的所有单引号替换为双引号。
你现在可以加载JSON文档,并通过pd.json_normalize(df["json_col"].apply(JSON .loads))将其读入Pandas DataFrame。
如果您愿意,您可以将所有' '(或您选择的特殊字符)替换回"。
因为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语法要求每个“键”和“值”都使用引号。这使得它成为一种非常健壮的数据格式。在下面的例子中,我使用颜色和颜色作为键:
{"colors":[
{
"color":"red",
"value":"#f00"
},
{
"color":"green",
"value":"#0f0"
},
{
"color":"blue",
"value":"#00f"
},
{
"color":"cyan",
"value":"#0ff"
},
{
"color":"magenta",
"value":"#f0f"
},
{
"color":"yellow",
"value":"#ff0"
},
{
"color":"black",
"value":"#000"
}]}