2012-02-08 2 views
26

Я пытаюсь разобрать объект JSON в Python dict. Я никогда не делал это раньше. Когда я искал эту ошибку (Что не так с первым символом?), другие сообщения сказали, что загружаемая строка на самом деле не является строкой JSON. Хотя я уверен, что это так.Пытается разобрать JSON на Python. 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

ответ

28

Это точно не JSON - не так, как напечатано выше. Он уже разбирается в объект Python - JSON будет иметь false, а не False, и не будет показывать строки как u для unicode (все строки JSON являются юникодами). Вы уверены, что уже не получаете свою строку json в объект Python бесплатно где-то в цепочке и, следовательно, загрузите ее в json.loads(), очевидно, неправильно, потому что на самом деле это не строка?

+2

Это была именно эта проблема. Благодарю. – gabe

27

Иногда вы можете получить эту ошибку, потому что ваши строковые значения не распознаются python. В качестве примера: я потратил довольно много времени на поиск происхождения такого рода ошибок. Вот что я нашел.

Иногда язык распознает тип кавычек, а не другой: Кстати, разобрать строку, чтобы JSON в JavaScript все цитаты должны быть в "формате

разобрать строку в JSON в JavaScript все цитаты должны быть в "формате, который не действительно логика

Надеется, вы можете использовать функцию замены для Python:..

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

Надеется, что это поможет вам сэкономить время, я потратил на охоту это ошибка

+0

Это проблема, с которой я столкнулся. Спасибо – Alireza

+0

Часть вашего ответа относительно котировок в JSON в JavaScript выглядит несколько противоречиво. Я пошел вперед и [проверял] (https://jsbin.com/pupayajoni/1/edit?js,console) оба варианта в JavaScript (в Chrome). Результат: ваш третий абзац прав: стандартный JavaScript-парсер не допускает одинарных кавычек как строковые литералы. –

+1

BTW [Спецификация JSON] (http://www.json.org) позволяет только строки, заключенные в двойные кавычки, поэтому это поведение не является специфичным для JavaScript и парсеров JSON Python. –

7

Я получил эту ошибку, когда у меня была висячая запятая в конце списка свойств. Из-за запятой ожидалось другое имя свойства, но его не было.

+1

Такая глупая вещь, что JSON не позволяет пропустить запятые! И, и абсолютный no-go, который json.load дает вам только «ValueError: Ожидание имени свойства, заключенного в двойные кавычки» – Ufos

0

Убедитесь, что ваш файл JSON не имеет строк, начинающихся с // (что неправомерно должно быть сделано комментариями!). У меня есть то же сообщение ValueError, и оно исчезло после того, как я удалил // из моего файла.