Ich habe viel zu viel Zeit damit verbracht, und es scheint mir, dass es eine einfache Lösung sein sollte. Ich versuche, die Authentifizierung von Facebook zu verwenden, um Benutzer auf meiner Website zu registrieren, und ich versuche, dies serverseitig zu tun. Ich habe den Punkt erreicht, an dem ich mein Zugriffstoken erhalte und wenn ich gehe zu:
https://graph.facebook.com/me?access_token=MY_ACCESS_TOKEN
Ich erhalte die gesuchten Informationen als Zeichenfolge, die wie folgt aussieht:
{"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"}
Es scheint, als ob ich nur in der Lage sein sollte, dies zu verwenden, dict(string)
aber ich erhalte den folgenden Fehler:
ValueError: dictionary update sequence element #0 has length 1; 2 is required
Also habe ich versucht, Pickle zu verwenden, aber diesen Fehler erhalten:
KeyError: '{'
Ich habe versucht, es django.serializers
zu de-serialisieren, hatte aber ähnliche Ergebnisse. Irgendwelche Gedanken? Ich denke, die Antwort muss einfach sein, und ich bin nur dumm. Vielen Dank für jede Hilfe!
"verified":true
schlägt fehl, sofern nichts anderestrue
definiert ist. Oder Sie könnten verwenden"verified":True
, oder"verified":"true"
.ast.literal_eval()
. Ihre (überarbeitete) Antwort ist jedoch richtig - ein JSON-Deserializer ist eine bessere Lösung.Antworten:
Diese Daten sind JSON ! Sie können es mit dem integrierten
json
Modul deserialisieren, wenn Sie mit Python 2.6+ arbeiten. Andernfalls können Sie das hervorragendesimplejson
Modul eines Drittanbieters verwenden .quelle
u
Ihren Beispiel-JSON-String vorgesetzt?decode()
- wenn sie eineunicode
Zeichenfolge ergeben würden - das habe ich in meinem Beispiel verwendet. Außerdem wird auf dieser Seite erwähnt, dass JSON immer in Unicode ist (Suche nach dem Begriff, es ist ungefähr auf halber Strecke)unicode
ist der Python-Typ, der eine Unicode-Zeichenfolge (big-U-Eigenname) enthält. Ich stimme auch zu, dass Unicode überhaupt keine Codierung ist, daher sollte ich vielleicht nicht auf diese Seite als Referenz verweisen. Es gibt jedoch keinen Grund, die Übergabe vonunicode
Zeichenfolgen zu vermeiden. Injson.loads
den Dokumenten wird eindeutig angegeben, dass dies durchaus akzeptabel ist, und ich verwende gerne eine vordecodierte Zeichenfolge, da diese expliziter ist.json.loads()
erwartet aber keinstr
in ASCII codiertes Objekt - es erwartet entweder einstr
in UTF-8 codiertes Objekt oder einunicode
Objekt (oder einstr
Objekt plus eine explizite Codierung)Verwenden Sie ast.literal_eval , um Python-Literale auszuwerten. Was Sie jedoch haben, ist JSON (beachten Sie beispielsweise "true"). Verwenden Sie daher einen JSON-Deserializer.
quelle