2011-02-06 5 views
64

그래서 나는 이것에 많은 시간을 할애했고, 그것은 나에게 간단한 수정이어야한다고 생각합니다. 페이스 북의 인증을 사용하여 내 사이트의 사용자를 등록하려고 시도하고 있으며 서버 측에서이를 수행하려고합니다. 나는 내 액세스 토큰을 얻을 지점에 입수하고, 한 내가 갈 때 :파이썬에서 사전에 문자열

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

내가 얻을 내가 찾는 정보이처럼 문자열로 :

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

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

그래서 내가 피클을 사용했지만,이 ERR을 가지고 :이 오류를 받고 있어요

그것은 내가 그냥이에 dict(string)을 사용할 수있을 것처럼 보이지만 나 :

KeyError: '{'

나는 그것을 해제 직렬화 django.serializers를 사용하여 시도했지만 비슷한 결과를 가지고 있었다. 이견있는 사람? 나는 대답이 단순해야한다고 생각하고, 나는 단지 어리 석다. 어떤 도움을 주셔서 감사합니다!

+0

문자열을 파이썬으로 평가하려면 문자열을 변경해야합니다 :' "verified": true'는'true'가 정의되지 않으면 실패합니다. 또는''검증 된 ': true' 또는''verified': "true"'를 사용할 수 있습니다. –

+2

@Matt : 그는 graph.facebook.com의 출력 형식을 변경할 수 있을지 의심 스럽다. –

+0

@Fred : 질문의 제목 ("Python에서 사전으로 문자열")이 주어지면'ast.literal_eval()'을 호출하기 전에 Python에서이 문자열을 변경할 수 있다고 생각합니다. JSON 디시리얼라이저가 더 나은 솔루션 인 경우 (수정 된) 답변이 옳습니다. –

답변

132

이 데이터는 JSON입니다! Python 2.6 이상을 사용하는 경우 내장 된 json module을 사용하여 역 직렬화 할 수 있습니다. 그렇지 않으면 우수한 타사 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

왜 JSON 문자열의 앞에'u'를 넣었습니까? –

+2

@ 존 : [유니 코드 문자열] (http://docs.python.org/howto/unicode.html#the-unicode-type)을 나타냅니다. 대부분 버릇이 없지만 Facebook API는 비 ASCII 문자로 데이터를 돌려 줄 수 있습니다. 이 경우 데이터는 (아마도 UTF-8로) 인코딩 될 것이고,'decode()'될 경우'unicode' 문자열을 얻을 것입니다. 이것은 제가 예제에서 사용한 것입니다. 또한, [이 페이지] (http://www.json.org/fatfree.html)에서 JSON은 항상 유니 코드 (용어 검색, 약 절반 정도) 인 것을 언급합니다. – Cameron

+2

파이썬에서 작은 u 유니 코드 리터럴을 나타냅니다. 습관은 좋은 이유가 아닙니다. "JSON 텍스트의 문자 인코딩은 항상 유니 코드입니다." - [Uu] nicode는 인코딩이 아닙니다. json.loads()가 기대하는 것은 일반적으로 ASCII로 인코딩 된 str 객체 인 "over the wire"가있는 것입니다. json.loads()에 unicode 객체를 의도적으로 넣는 유일한 경우는 이상한 사람이 UTF-16으로 전달한 곳이며 문서화 된대로 직접 해독해야합니다. –

13

ast.literal_eval을 사용하여 파이썬 리터럴을 평가하십시오. 그러나 가지고있는 것은 JSON (예를 들어, "true"에주의하십시오.)이므로 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'} 
관련 문제