파이썬에서 사전에 문자열


126

그래서 나는 이것에 많은 시간을 보냈고 그것은 간단한 수정이 될 것 같습니다. 내 사이트에 사용자를 등록하기 위해 Facebook의 인증을 사용하려고하는데, 서버 측에서 시도하고 있습니다. 액세스 토큰을 얻을 수있는 지점에 도달했고 다음으로 이동했습니다.

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

내가 dict(string)이것을 사용할 수 있어야하는 것 같지만이 오류가 발생합니다.

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

그래서 Pickle을 사용해 보았지만 다음과 같은 오류가 발생했습니다.

KeyError: '{'

나는 django.serializers그것을 de-serialize하기 위해 시도 했지만 비슷한 결과를 얻었습니다. 이견있는 사람? 대답은 간단해야한다고 생각하고 그냥 어리석은 것 같아요. 도움을 주셔서 감사합니다!


문자열을 Python으로 평가하려면 문자열을 변경해야 할 수 있습니다 . 정의 "verified":true되지 않은 경우 실패합니다 true. 또는 "verified":True, 또는을 사용할 수 있습니다 "verified":"true".
Matt Curtis

2
@Matt : 그가 graph.facebook.com의 출력 형식을 변경할 수 있을지 의심 스럽습니다.
Fred Nurk

@Fred : 질문의 제목 ( "String to Dictionary in Python")을 감안할 때 ast.literal_eval(). 하지만 귀하의 (수정 된) 대답은 맞습니다-JSON deserializer가 더 나은 솔루션입니다.
Matt Curtis

1
@MattCurtis : 강력한 방식으로 변경하면 (ast.literal_eval 이전) 처음에는 JSON으로 구문 분석해야합니다. OP가 dict (some_string)으로하려고 한 작업을 수행하는 올바른 방법으로 ast.literal_eval을 언급했습니다.
Fred Nurk

@Fred : 동의하는 것 같습니다 :-)
Matt Curtis

답변:


239

이 데이터는 JSON입니다 ! Python 2.6 이상을 사용하는 경우 내장 json모듈을 사용하여 역 직렬화 할 수 있습니다 . 그렇지 않으면 우수한 타사 simplejson모듈을 사용할 수 있습니다 .

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

5
u예제 JSON 문자열 앞에 왜 넣었 습니까?
John Machin

2
@John : 유니 코드 문자열을 나타냅니다 . 대부분은 습관에서 벗어 났지만 아마도 Facebook API는 ASCII가 아닌 문자가 포함 된 데이터를 반환 할 수 있습니다. 이 경우 데이터가 인코딩되고 (아마도 UTF-8로) decode()-ing unicode문자열 이 생성 됩니다. 또한 이 페이지 에서는 JSON이 항상 유니 코드로되어 있다고 언급합니다 (용어 검색, 약 절반 정도)
Cameron

3
Python에서 small-u 유니 코드 리터럴을 나타냅니다. 습관은 좋은 이유가 아닙니다. "JSON 텍스트의 문자 인코딩은 항상 유니 코드입니다." -[Uu] nicode는 인코딩이 아닙니다. json.loads ()가 기대하는 것은 일반적으로 ASCII로 인코딩 된 str 객체 인 "전선을 통해"얻은 것입니다. 의도적으로 json.loads ()에 유니 코드 객체를 제공하는 유일한 경우는 이상한 사람이 UTF-16으로 전송했으며 문서화 된대로 직접 디코딩해야하는 경우입니다.
John Machin

1
@John : 예, small-u unicode는 유니 코드 (big-U 고유 명사) 문자열을 포함하는 Python 유형입니다. 또한 유니 코드가 인코딩이 아님에 동의하므로 해당 페이지를 참조로 지정해서는 안됩니다. 그러나 unicode문자열을에 전달하는 것을 피할 이유는 없습니다 json.loads. 문서 에는 이것이 완벽하게 허용된다는 것이 명확하게 명시되어 있으며, 더 명시 적이므로 미리 디코딩 된 문자열을 사용하는 것이 좋습니다.
Cameron

8
@ 존 : 죄송합니다 학자 연,하지만 json.loads()기대하지 않는 str개체가 ASCII로 인코딩 - 그 중 하나 기대 str로 인코딩 된 객체 UTF-8 또는 unicode객체 (또는 str객체 플러스 명시 적으로 인코딩)
카메론

19

ast.literal_eval 을 사용 하여 Python 리터럴을 평가합니다. 그러나 가지고있는 것은 JSON (예 : "true")이므로 JSON deserializer를 사용하십시오.

>>> 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'jdoe@gmail.com', 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'}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.