Я потратил на это много времени, и мне кажется, что это должно быть простое решение. Я пытаюсь использовать аутентификацию Facebook для регистрации пользователей на моем сайте, и я пытаюсь сделать это на стороне сервера. Я дошел до точки, где я получаю свой токен доступа, и когда я перехожу к:
https://graph.facebook.com/me?access_token=MY_ACCESS_TOKEN
Я получаю информацию, которую ищу, в виде такой строки:
{"id":"123456789","name":"John Doe","first_name":"John","last_name":"Doe","link":"http:\/\/www.facebook.com\/jdoe","gender":"male","email":"jdoe\u0040gmail.com","timezone":-7,"locale":"en_US","verified":true,"updated_time":"2011-01-12T02:43:35+0000"}
Похоже, я просто могу использовать dict(string)
это, но я получаю эту ошибку:
ValueError: dictionary update sequence element #0 has length 1; 2 is required
Итак, я попытался использовать Pickle, но получил эту ошибку:
KeyError: '{'
Я попытался использовать его django.serializers
для десериализации, но получил аналогичные результаты. Есть предположения? Я чувствую, что ответ должен быть простым, а я просто дурак. Спасибо за любую помощь!
"verified":true
fails, еслиtrue
она не определена. Или вы можете использовать"verified":True
, или"verified":"true"
.ast.literal_eval()
. Однако ваш (исправленный) ответ правильный - десериализатор JSON - лучшее решение.Ответы:
Это данные в формате JSON ! Вы можете десериализовать его с помощью встроенного
json
модуля, если вы используете Python 2.6+, в противном случае вы можете использовать отличный стороннийsimplejson
модуль .источник
u
перед своим примером строку JSON?decode()
получитсяunicode
строка - это то, что я использовал в моем примере. Кроме того, на этой странице упоминается, что JSON всегда находится в Юникоде (ищите термин, он примерно на полпути вниз)unicode
- это тип Python, который содержит строку Unicode (собственное существительное big-U). Я также согласен с тем, что Unicode - это вовсе не кодировка, поэтому, возможно, мне не следует указывать на эту страницу в качестве ссылки. Однако нет причин избегать передачиunicode
строкjson.loads
- в документации четко указано, что это вполне приемлемо, и мне нравится использовать предварительно декодированные строки, поскольку они более явные.json.loads()
не ожидает, чтоstr
объект закодирован в ASCII - он ожидает либоstr
объект, закодированный в UTF-8, либоunicode
объект (илиstr
объект плюс явное кодирование)Используйте ast.literal_eval для оценки литералов Python. Однако у вас есть JSON (например, обратите внимание на «true»), поэтому используйте десериализатор JSON.
источник