Então, eu gastei muito tempo nisso, e parece-me que deve ser uma solução simples. Estou tentando usar a autenticação do Facebook para registrar usuários no meu site e estou tentando fazer isso do lado do servidor. Cheguei ao ponto em que recebo meu token de acesso e quando vou para:
https://graph.facebook.com/me?access_token=MY_ACCESS_TOKEN
Eu recebo as informações que estou procurando como uma string assim:
{"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"}
Parece que eu deveria ser capaz de usar dict(string)
isso, mas estou recebendo este erro:
ValueError: dictionary update sequence element #0 has length 1; 2 is required
Então, eu tentei usar Pickle, mas recebi este erro:
KeyError: '{'
Tentei usar django.serializers
a desserialização, mas obtive resultados semelhantes. Alguma ideia? Eu sinto que a resposta tem que ser simples, e só estou sendo burra. Obrigado por qualquer ajuda!
"verified":true
falha, a menos quetrue
esteja definido. Ou você pode usar"verified":True
, ou"verified":"true"
.ast.literal_eval()
. Sua resposta (revisada) está correta, no entanto - um desserializador JSON é uma solução melhor.Respostas:
Estes dados são JSON ! Você pode desserializá-lo usando o
json
módulo interno, se você estiver no Python 2.6+, caso contrário, poderá usar o excelentesimplejson
módulo de terceiros .fonte
u
na frente da sua string JSON de exemplo?decode()
, se produzirem umaunicode
string - que é o que eu usei no meu exemplo. Além disso, esta página menciona JSON está sempre em Unicode (procurar o termo, é cerca de meio caminho para baixo)unicode
é o tipo Python, que contém uma string Unicode (grande nome próprio de U). Também concordo que o Unicode não é uma codificação, portanto, talvez eu não deva apontar para a página como referência. Porém, não há motivo para evitar a passagem deunicode
stringsjson.loads
- os documentos afirmam claramente que isso é perfeitamente aceitável e eu gosto de usar uma string pré-decodificada, pois é mais explícita.json.loads()
não espera umstr
objeto codificado em ASCII - ele espera umstr
objeto codificado em UTF-8 ou umunicode
objeto (ou umstr
objeto mais uma codificação explícita)Use ast.literal_eval para avaliar literais em Python. No entanto, o que você tem é JSON (observe "true", por exemplo), portanto, use um desserializador JSON.
fonte