2011-02-06 22 views
64

Quindi ho passato molto tempo su questo, e mi sembra che dovrebbe essere una soluzione semplice. Sto cercando di utilizzare l'autenticazione di Facebook per registrare gli utenti sul mio sito e sto cercando di farlo dal lato server. Ho ottenuto al punto in cui ho il mio token di accesso, e quando vado a:Stringa al dizionario in Python

https://graph.facebook.com/me?access_token=MY_ACCESS_TOKEN

ottengo le informazioni che sto cercando come una stringa che è come questo:

{"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"}

sembra che dovrei essere in grado di utilizzare dict(string) su questo, ma sto ottenendo questo errore:

ValueError: dictionary update sequence element #0 has length 1; 2 is required

Così ho provato ad utilizzare Pickle, ma ha ottenuto questo err o:

KeyError: '{'

Ho provato ad utilizzare django.serializers di de-serializzare, ma ha avuto risultati simili. qualche idea? Sento che la risposta deve essere semplice e sono solo stupida. Grazie per qualsiasi aiuto!

+0

Se si desidera valutare la stringa come Python, potrebbe essere necessario modificare la stringa: '" verificato ": true' ha esito negativo a meno che non sia definito' true'. O potresti usare '" verificato ": True', o" "verificato": "true" '. –

+2

@Matt: dubito che possa modificare il formato di output di graph.facebook.com. –

+0

@Fred: Dato il titolo della domanda ("String to Dictionary in Python"), immagino che potrebbe cambiarlo da Python prima di chiamare 'ast.literal_eval()'. La tua risposta (revisionata) è giusta, tuttavia - un deserializzatore JSON è una soluzione migliore. –

risposta

132

Questi dati sono JSON! Puoi deserializzare usando il built-in json module se sei su Python 2.6+, altrimenti puoi usare l'eccellente terze parti simplejson module.

import json # or `import simplejson as json` if on Python < 2.6 

json_string = u'{ "id":"123456789", ... }' 
obj = json.loads(json_string) # obj now contains a dict of the data 
+2

Perché hai messo 'u' davanti alla tua stringa JSON di esempio? –

+2

@John: indica una [stringa Unicode] (http://docs.python.org/howto/unicode.html#the-unicode-type). L'ho messo principalmente per abitudine, ma presumibilmente l'API di Facebook può restituire dati con caratteri non ASCII; in quel caso, i dati sarebbero codificati (probabilmente in UTF-8), e 'decode()' -ing produrrebbe una stringa 'unicode' - che è ciò che ho usato nel mio esempio. Inoltre, [questa pagina] (http://www.json.org/fatfree.html) menziona JSON è sempre in Unicode (cerca il termine, è circa a metà strada) – Cameron

+2

Indica un letterale unicode small-u in Python. L'abitudine non è una buona ragione. "La codifica dei caratteri del testo JSON è sempre Unicode." - [Uu] nicode NON è una codifica. Quello che json.loads() si aspetta è quello che hai "over the wire" che è tipicamente un oggetto str codificato in ASCII. L'unico caso in cui si alimenterebbe json.loads() un oggetto unicode intenzionalmente è dove una persona strana l'aveva trasmesso in UTF-16 e come documentato è necessario decodificarlo da solo. –

13

Utilizzare ast.literal_eval per valutare i valori letterali di Python. Tuttavia, quello che hai è JSON (nota "true" per esempio), quindi usa un deserializzatore JSON.

>>> import json 
>>> s = """{"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"}""" 
>>> json.loads(s) 
{u'first_name': u'John', u'last_name': u'Doe', u'verified': True, u'name': u'John Doe', u'locale': u'en_US', u'gender': u'male', u'email': u'[email protected]', u'link': u'http://www.facebook.com/jdoe', u'timezone': -7, u'updated_time': u'2011-01-12T02:43:35+0000', u'id': u'123456789'} 
Problemi correlati