在Python中解析JSON时出现ValueError:期待属性名

27 投票
4 回答
48564 浏览
提问于 2025-04-17 12:33

我正在尝试把一个JSON对象转换成Python中的一个dict(字典)。我以前从来没有做过这件事。当我在网上搜索这个特定的错误时,看到其他帖子说加载的字符串其实并不是一个JSON字符串。不过我很确定这就是一个JSON字符串。

在这种情况下,eval()可以正常工作,但我在想有没有更合适的方法呢?

注意:这个字符串是直接来自Twitter,通过ptt工具获取的。

>>> import json
>>> line = '{u\'follow_request_sent\': False, u\'profile_use_background_image\': True,
         u\'default_profile_image\': False, 
         u\'verified\': False, u\'profile_sidebar_fill_color\': u\'DDEEF6\',
         u\'profile_text_color\': u\'333333\', u\'listed_count\': 0}'
>>> json.loads(line)

Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 326, in loads
       return _default_decoder.decode(s)
     File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode
       obj, end = self.raw_decode(s, idx=_w(s, 0).end())
     File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode
       obj, end = self.scan_once(s, idx)
   ValueError: Expecting property name: line 1 column 1 (char 1)

4 个回答

7

我遇到了这个错误,是因为在一组属性的最后加了一个多余的逗号。因为这个逗号,系统以为后面还会有另一个属性名,但实际上并没有。

28

有时候,你可能会遇到这个错误,因为你的字符串值没有被Python正确识别。举个例子,我花了很多时间去找出这种错误的原因。以下是我发现的。

有时候,某种语言只认一种引号,而不认另一种引号:顺便说一下,在JavaScript中,要把字符串解析成JSON,所有的引号必须用'这种格式。

而在JavaScript中,要把字符串解析成JSON,所有的引号必须用"这种格式,这其实不太合理。

希望你可以使用替换功能。对于Python来说:

json.loads(s.replace("\'", '"'));

希望这能帮你节省我花在找这个错误上的时间!

29

这绝对不是JSON格式——至少从上面的样子来看不是。它已经被解析成了一个Python对象。JSON格式应该是false,而不是False,而且字符串不会显示成u,因为所有的JSON字符串都是unicode格式。你确定在某个环节没有把你的JSON字符串自动转换成Python对象吗?如果已经转换了,那再用json.loads()去加载它就明显不对了,因为它其实根本不是字符串。

撰写回答