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

任何建议都将不胜感激。


当前回答

这很简单

import json

my_str = '{"message_type": "fixed_price_difference", "message": "Hello hello"}'

print(type(json.loads(my_str)), json.dumps(my_str))

Output:
    <class 'dict'> "{\"message_type\": \"fixed_price_difference\", \"message\": \"Hello hello\"}"

比如语法就很重要

语法错误,不正确: my_str = "{'message_type': 'fixed_price_difference', 'message': 'Hello Hello '}'

正确的语法: my_str = '{"message_type": "fixed_price_difference", "message": "Hello Hello "}'

最后: 声明字符串以引号开始和结束。

其他回答

正如它清楚地说错了,名字应该用双引号括起来,而不是单引号。您传递的字符串不是有效的JSON。它应该是这样的

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

我有这个错误试图规范化嵌套的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。

如果您愿意,您可以将所有' '(或您选择的特殊字符)替换回"。

在我的例子中,双引号不是问题。

最后一个逗号给了我同样的错误信息。

{'a':{'b':c,}}
           ^

为了删除这个逗号,我写了一些简单的代码。

import json

with open('a.json','r') as f:
    s = f.read()
    s = s.replace('\t','')
    s = s.replace('\n','')
    s = s.replace(',}','}')
    s = s.replace(',]',']')
    data = json.loads(s)

这对我很有效。

with open('input.json','r') as f:
    s = f.read()
    s = s.replace('\'','\"')
    data = json.loads(s)

这对我来说非常有效。谢谢。

我强烈建议使用json美化工具,如json美化工具,因为它帮助我修复了json文件中尾随逗号的错误,该错误产生了相同的错误。