Python中的字符串到字典

Python中的字符串到字典,python,string,json,facebook,dictionary,Python,String,Json,Facebook,Dictionary,所以我花了很多时间在这上面,在我看来,这应该是一个简单的解决方案。我正在尝试使用Facebook的身份验证在我的网站上注册用户,我正在尝试在服务器端注册。我已经到了获取访问令牌的地步,当我转到: 我以字符串的形式获取我要查找的信息,如下所示: {“id”:“123456789”,“name”:“John Doe”,“first\u name”:“John”,“last\u name”:“Doe”,“link”:“http:\/\/www.facebook.com\/jdoe”,“gender”

所以我花了很多时间在这上面,在我看来,这应该是一个简单的解决方案。我正在尝试使用Facebook的身份验证在我的网站上注册用户,我正在尝试在服务器端注册。我已经到了获取访问令牌的地步,当我转到:

我以字符串的形式获取我要查找的信息,如下所示:

{“id”:“123456789”,“name”:“John Doe”,“first\u name”:“John”,“last\u name”:“Doe”,“link”:“http:\/\/www.facebook.com\/jdoe”,“gender”:“male”,“email”:“jdoe\u0040gmail.com”,“timezone”:-7,“locale”:“en\u US”,“verified”:true,“updated\u time”:“2011-01-12T02:43:35+0000”

似乎我应该能够在这个问题上使用
dict(string)
,但我遇到了以下错误:

ValueError:字典更新序列元素#0的长度为1;2是必需的

因此,我尝试使用Pickle,但出现以下错误:

keyrerror:'{'

我尝试使用
django.serializers
对其进行反序列化,但结果类似。有什么想法吗?我觉得答案必须很简单,我只是太傻了。感谢您的帮助!

使用来评估Python文本。但是,您得到的是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'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'}
此数据是!如果您使用的是Python 2.6+,则可以使用内置的反序列化,否则可以使用优秀的第三方

import json#或在Python<2.6上使用“import simplejson as json”
json_string=u'{“id”:“123456789”,…}”
loads(json#U字符串)#obj现在包含数据的dict

如果您想将字符串作为Python进行求值,您可能需要更改字符串:
“已验证”:除非定义了
true
,否则true
将失败。或者您可以使用
“已验证”:true
,或
“已验证”:“true”
@Matt:我怀疑他是否可以更改graph.facebook.com的输出格式。@Fred:给出了问题的标题(“字符串到Python中的字典”),我想他可以在调用
ast.literal\u eval()
之前将其从Python中更改。不过,您(修订后)的答案是正确的-JSON反序列化器是一个更好的解决方案。@MattCurtis:以一种健壮的方式更改它(在ast.literal\u eval之前)首先需要将其解析为JSON。我提到ast.literal\u eval是OP尝试使用dict(一些字符串)执行操作的正确方法@Fred:我想我们同意:-)你为什么在你的示例JSON字符串前面放
u
?@John:这表示一个。我放它主要是出于习惯,但可能Facebook API可以返回包含非ASCII字符的数据;在这种情况下,数据将被编码(可能是UTF-8)和
decode()
-ing它将产生一个
unicode
字符串——这就是我在示例中使用的字符串。此外,提到JSON总是使用unicode(搜索这个词,它大约向下一半),它表示Python中的一个小u unicode文本。习惯不是一个很好的理由。“JSON文本的字符编码总是unicode。”--[Uu]nicode不是一种编码。json.loads()所期望的是“通过连接”得到的东西,它通常是一个用ASCII编码的str对象。在这种情况下,您只需输入json.loads()unicode对象是某个陌生人故意用UTF-16传输它的地方,如文件所述,你需要自己解码。@John:是的,small-u
unicode
是Python类型,它包含unicode(大-u专有名词)字符串。我也同意Unicode根本不是一种编码,所以也许我不应该指向该页作为参考。没有理由避免将
Unicode
字符串传递给
json.loads
,不过,这清楚地表明这是完全可以接受的,我喜欢使用预解码字符串,因为它更明确。@John:抱歉,说得太迂腐了,但是
json.loads()
不需要ASCII编码的
str
对象——它需要UTF-8编码的
str
对象或
unicode
对象(或
str
对象加显式编码)
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