Więc spędziłem nad tym dużo czasu i wydaje mi się, że powinno to być proste rozwiązanie. Próbuję użyć uwierzytelniania Facebooka, aby zarejestrować użytkowników w mojej witrynie i próbuję to zrobić po stronie serwera. Doszedłem do punktu, w którym otrzymuję token dostępu, a kiedy idę:
https://graph.facebook.com/me?access_token=MY_ACCESS_TOKEN
Informacje, których szukam, otrzymuję jako ciąg, który wygląda następująco:
{"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"}
Wygląda na to, że powinienem być w stanie użyć dict(string)
tego, ale otrzymuję ten błąd:
ValueError: dictionary update sequence element #0 has length 1; 2 is required
Więc próbowałem użyć Pickle, ale otrzymałem ten błąd:
KeyError: '{'
Próbowałem użyć django.serializers
do de-serializacji, ale miałem podobne wyniki. jakieś pomysły? Czuję, że odpowiedź musi być prosta, a ja po prostu jestem głupi. Dzięki za pomoc!
"verified":true
nie powiedzie się, chyba żetrue
jest zdefiniowany. Lub możesz użyć"verified":True
, lub"verified":"true"
.ast.literal_eval()
. Twoja (poprawiona) odpowiedź jest jednak poprawna - deserializator JSON jest lepszym rozwiązaniem.Odpowiedzi:
Te dane to JSON ! Możesz deserializować go za pomocą wbudowanego
json
modułu, jeśli korzystasz z Pythona 2.6+, w przeciwnym razie możesz użyć doskonałegosimplejson
modułu innej firmy .źródło
u
przed przykładowym ciągiem JSON?decode()
-ing dałobyunicode
ciąg znaków - czego użyłem w moim przykładzie. Ta strona wspomina również, że JSON jest zawsze w Unicode (wyszukaj termin, jest mniej więcej w połowie)unicode
to typ Pythona, który zawiera ciąg znaków Unicode (duży-U). Zgadzam się również, że Unicode wcale nie jest kodowaniem, więc może nie powinienem wskazywać tej strony jako odniesienia. Nie ma jednak powodu, aby unikać przekazywaniaunicode
ciągów dojson.loads
- dokumentacja jasno stwierdza, że jest to całkowicie akceptowalne, a ja lubię używać wstępnie zdekodowanego ciągu, ponieważ jest bardziej wyraźny.json.loads()
nie oczekujęstr
obiektu zakodowanego w ASCII - oczekujestr
obiektu zakodowanego w UTF-8 lubunicode
obiektu (lubstr
obiektu plus jawne kodowanie)Użyj ast.literal_eval do oceny literałów Pythona. Jednak to, co masz, to JSON (na przykład uwaga „prawda”), więc użyj deserializatora JSON.
źródło