Python中的字符串到字典


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反序列化它,但结果相似。有什么想法吗?我觉得答案必须很简单,而且我很愚蠢。谢谢你的帮助!


如果要将字符串评估为Python,则可能需要更改字符串:"verified":true除非true定义,否则失败。或者您可以使用"verified":True"verified":"true"
马特·柯蒂斯

2
@Matt:我怀疑他可以更改graph.facebook.com的输出格式。
弗雷德·纽克

@Fred:给出问题的标题(“ Python中的字符串到字典”),我想他可以在调用之前将其从Python更改ast.literal_eval()。不过,您的(修订后的)答案是正确的-JSON解串器是更好的解决方案。
马特·柯蒂斯

1
@MattCurtis:以健壮的方式更改它(在ast.literal_eval之前)将需要首先将其解析为JSON。我提到ast.literal_eval是做OP用dict(some_string)尝试做的正确方法。
Fred Nurk,2011年

@弗雷德:我认为我们同意:-)
马特·柯蒂斯

Answers:


238

此数据为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字符串前面?
约翰·马钦

2
@John:表示Unicode字符串。我主要是出于习惯,但大概Facebook API可以返回其中包含非ASCII字符的数据。在这种情况下,数据将被编码(可能以UTF-8编码),并且decode()-ing它会产生一个unicode字符串-这就是我在示例中使用的字符串。此外,此页面还提到JSON始终使用Unicode(搜索该术语的时间大约为一半)
Cameron

3
它表示Python中的小u unicode文字。习惯不是一个好理由。“ JSON文本的字符编码始终是Unicode。” -[unicode]不是编码。json.loads()期望的是您“通过网络”获得的信息,通常是用ASCII编码的str对象。唯一有意向json.loads()提供一个unicode对象的情况是,某个陌生人已经以UTF-16传输了该对象,并且据记录,您需要自己对其进行解码。
约翰·马钦

1
@John:是的,small-u unicode是Python类型,其中包含Unicode(big-U专有名词)字符串。我也同意Unicode根本不是一种编码,因此也许我不应该以该页面为参考。不过,没有理由避免将unicode字符串传递给json.loads- 文档清楚地表明这是完全可以接受的,而且我喜欢使用预解码的字符串,因为它更明确。
卡梅伦

8
@John:很抱歉,是个书呆子,但json.loads()不希望使用strASCII编码的对象–它希望使用UTF-8str编码的对象或对象(或对象加上显式编码)unicodestr
Cameron

19

使用ast.literal_eval评估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'}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.