Así que he dedicado mucho tiempo a esto, y me parece que debería ser una solución simple. Estoy tratando de usar la autenticación de Facebook para registrar usuarios en mi sitio, y estoy tratando de hacerlo desde el lado del servidor. He llegado al punto donde obtengo mi token de acceso y cuando voy a:
https://graph.facebook.com/me?access_token=MY_ACCESS_TOKEN
Recibo la información que busco como una cadena que es así:
{"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 debería poder usar dict(string)
esto, pero recibo este error:
ValueError: dictionary update sequence element #0 has length 1; 2 is required
Así que intenté usar Pickle, pero obtuve este error:
KeyError: '{'
Intenté usar django.serializers
para deserializarlo pero obtuve resultados similares. ¿Alguna idea? Siento que la respuesta tiene que ser simple, y solo estoy siendo estúpida. ¡Gracias por cualquier ayuda!
"verified":true
falla a menos quetrue
esté definida. O podrías usar"verified":True
, o"verified":"true"
.ast.literal_eval()
. Sin embargo, su respuesta (revisada) es correcta: un deserializador JSON es una mejor solución.Respuestas:
¡Estos datos son JSON ! Puede deserializarlo usando el
json
módulo incorporado si está en Python 2.6+, de lo contrario puede usar el excelentesimplejson
módulo de terceros .fuente
u
delante de tu cadena JSON de ejemplo?decode()
al producirse unaunicode
cadena, que es lo que usé en mi ejemplo. Además, esta página menciona que JSON siempre está en Unicode (busque el término, está a medio camino)unicode
es el tipo de Python, que contiene una cadena Unicode (nombre propio big-U). También estoy de acuerdo en que Unicode no es en absoluto una codificación, por lo que tal vez no debería apuntar a esa página como referencia. Sin embargo, no hay ninguna razón para evitar pasarunicode
cadenasjson.loads
: los documentos establecen claramente que esto es perfectamente aceptable, y me gusta usar una cadena predescodificada, ya que es más explícita.json.loads()
no espera unstr
objeto codificado en ASCII; espera unstr
objeto codificado en UTF-8 o ununicode
objeto (o unstr
objeto más una codificación explícita)Use ast.literal_eval para evaluar literales de Python. Sin embargo, lo que tienes es JSON (nota "verdadero" por ejemplo), así que usa un deserializador JSON.
fuente