2012-02-08 24 views
26

我想解析一个JSON对象到Python dict。我从来没有这样做过。当我搜索这个特定的错误时,(第一个字符有什么问题?),其他帖子都说,被加载的字符串实际上并不是JSON字符串。不过,我很确定这是。试图解析Python中的JSON。 ValueError:期望的属性名称

在这种情况下,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) 
+8

这只是python语法,而不是JSON。使用'ast.literal_eval'进行安全评估 – JBernardo 2012-02-08 04:36:28

回答

28

这绝对不是JSON--不像上面那样打印。它已经被解析为一个Python对象 - JSON将有false而不是False,并且不会显示字符串作为unicode的u(所有JSON字符串都是unicode)。你确定你没有把你的json字符串变成一个Python对象在链中的某个地方,因此将它加载到json.loads()中显然是错误的,因为事实上它不是一个字符串?

+2

这正是问题所在。谢谢。 – gabe 2012-02-22 19:53:02

27

有时你可以有这个错误,因为你的字符串值不被python很好地识别。举个例子:我花了很多时间来寻找这种错误的起源。这是我发现的。

有时,语言识别的一种报价,而不是另一个问题: 顺便说一句,在解析字符串到JSON在JavaScript中所有的报价必须在“格式

将字符串解析成JavaScript的JSON所有的报价都在“格式是不是真的逻辑

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

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

希望它会拯救你,我已经花了狩猎这个时间错误!

+0

这是我遇到的问题。谢谢 – Alireza 2015-01-09 09:28:46

+0

有关JavaScript中JSON引号的回答部分看起来有点矛盾。我继续和[测试](https://jsbin.com/pupayajoni/1/edit?js,console)在JavaScript中的两种变体(在Chrome中)。结果是:第三段是正确的:标准JavaScript解析器不允许单引号作为字符串字面边界。 – 2016-03-23 17:43:05

+1

顺便说一句[JSON规范](http://www.json.org)只允许用双引号括起来的字符串,所以这种行为并不特定于JavaScript和Python JSON解析器。 – 2016-03-23 17:45:30

7

当我在属性列表的末尾挂了一个逗号时,我得到了这个错误。由于逗号期望另一个属性名称,但没有。

+1

JSON不允许尾随逗号这样一个愚蠢的东西!而绝对禁止,json.load只给你'ValueError:期望用双引号括起来的属性名称 – Ufos 2016-10-21 12:07:10

0

确保您的JSON文件没有以//开头的行(错误地应该注释!)。我有相同的ValueError消息,并且在我从我的文件中删除//后消失了。