J'ai donc passé beaucoup trop de temps là-dessus, et il me semble que cela devrait être une solution simple. J'essaie d'utiliser l'authentification de Facebook pour enregistrer les utilisateurs sur mon site, et j'essaye de le faire côté serveur. Je suis arrivé au point où j'obtiens mon jeton d'accès, et quand je vais à:
https://graph.facebook.com/me?access_token=MY_ACCESS_TOKEN
J'obtiens les informations que je recherche sous la forme d'une 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 simplement pouvoir l'utiliser dict(string)
, mais j'obtiens 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é de l'utiliser django.serializers
pour le désérialiser mais j'ai eu des résultats similaires. Des pensées? J'ai l'impression que la réponse doit être simple, et je suis juste stupide. Merci pour toute aide!
"verified":true
échoue sauf si elletrue
est définie. Ou vous pouvez utiliser"verified":True
, ou"verified":"true"
.ast.literal_eval()
. Votre réponse (révisée) est juste, cependant - un désérialiseur JSON est une meilleure solution.Réponses:
Ces données sont JSON ! Vous pouvez le désérialiser à l'aide du
json
module intégré si vous êtes sur Python 2.6+, sinon vous pouvez utiliser l'excellentsimplejson
module tiers .la source
u
devant votre exemple de chaîne JSON?decode()
-en cela produirait uneunicode
chaîne - ce que j'ai utilisé dans mon exemple. En outre, cette page mentionne que JSON est toujours en Unicode (recherchez le terme, il est à peu près à mi-chemin)unicode
est le type Python, qui contient une chaîne Unicode (nom propre big-U). Je suis également d'accord pour dire qu'Unicode n'est pas du tout un encodage, alors peut-être que je ne devrais pas pointer vers cette page comme référence. Il n'y a aucune raison d'éviter de passer desunicode
chaînes àjson.loads
, cependant - la documentation indique clairement que cela est parfaitement acceptable, et j'aime utiliser une chaîne pré-décodée car elle est plus explicite.json.loads()
ne s'attend pas à unstr
objet encodé en ASCII - il attend soit unstr
objet encodé en UTF-8, soit ununicode
objet (ou unstr
objet plus un encodage explicite)Utilisez ast.literal_eval pour évaluer les littéraux Python. Cependant, ce que vous avez est JSON (notez "true" par exemple), utilisez donc un désérialiseur JSON.
la source