web-dev-qa-db-fra.com

Chaîne vers Dictionnaire dans Python

J'ai donc passé beaucoup de temps à ce sujet, et il me semble que cela devrait être une solution simple. J'essaie d'utiliser l'authentification de Facebook pour enregistrer des utilisateurs sur mon site, et j'essaie de le faire côté serveur. J'ai atteint le point où je reçois mon jeton d'accès, et quand je vais à:

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

Je reçois l'information que je cherche sous forme de chaîne qui ressemble à ceci:

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

Il semble que je devrais juste être capable d'utiliser dict(string) sur ceci mais je reçois cette erreur:

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

J'ai donc essayé d'utiliser Pickle, mais j'ai eu cette erreur:

KeyError: '{'

J'ai essayé d'utiliser Django.serializers Pour le désérialiser, mais j'ai obtenu des résultats similaires. Des pensées? Je pense que la réponse doit être simple et que je suis juste stupide. Merci pour toute aide!

100
LunaCodeGirl

Ces données sont [~ # ~] json [~ # ~] ! Vous pouvez le désérialiser en utilisant le module intégré json si Python 2.6 +, sinon vous pouvez utiliser l'excellent tiers 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
194
Cameron

Utilisez ast.literal_eval pour évaluer les littéraux Python. Toutefois, vous disposez de JSON (notez "true" par exemple), utilisez donc un désérialiseur 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'}
16
Fred Nurk