如何使用Python解析Facebook API返回的字典列表字符串?
在使用django-social-auth从Facebook获取用户数据时,返回的是一个包含字典的Unicode字符串。例如,调用response.get('education')时,得到的结果是:
u"[{u'school': {u'id': u'12345', u'name': u'Joe Thiesman High'}, u'type': u'High School'}, {u'school': {u'id': u'23456', u'name': u'Joe Montana University'}, u'type': u'College'}]"
我想把这个字符串转换成一个列表,这样我就可以提取里面的数据,但我遇到了一些困难。之前看到一个类似问题的回答(Python中字符串转字典)建议使用:
foo=json.loads(string)
但是这个方法不行,因为返回的是一个包含多个字典的列表,每个字典代表一所学校,而不是单纯的字典,所以它似乎搞混了。我收到的错误信息是:
ValueError: Extra Data: line 1 column 73 - line 1 column 144
最开始,我遇到的错误是ValueError: Expecting Property Name: line 1, column 2,直到我使用string.replace()把双引号换成单引号,反之亦然。这样确实解决了那个错误,但我提到这个是因为我不确定这是不是正确的解决办法。
3 个回答
看起来你提供的返回数据里有个拼写错误。在最后的 u'type' 前面缺少一个逗号。
我不太确定我是否完全理解你的问题,但我觉得你想要的代码是这个。
retVal = eval(u"[{u'school': {u'id': u'12345', u'name': u'Joe Thiesman High'}, u'type': u'High School'}, {u'school': {u'id': u'23456', u'name': u'Joe Montana University'}, u'type': u'College'}]")
class School:
def __init__(self):
self.type = ""
self.id = ""
self.name = ""
def setType(self, type):
self.type = type
def getType(self):
return self.type
def setId(self, id):
self.id= id
def getId(self):
return self.id
def setName(self, name):
self.name = name
def getName(self):
return self.name
class schoolParser:
def __init__(self, dict):
self.schoolData = dict
self.schools=[]
for i in range(len(self.schoolData)):
school = School()
school.setId ( self.schoolData[i]['school']['id'] )
school.setName ( self.schoolData[i]['school']['name'] )
school.setType ( self.schoolData[i]['type'] )
self.schools.append(school)
# Later in the code you get data like this
for school in self.schools:
print school.getName(), school.getType(), school.getId()
if __name__ == "__main__" : schoolParser(retVal)
稍微调整一下格式,你可以使用类似下面的代码:
uDictList = eval(inputString)
这可能不是最好的解决办法,但或许能帮到你。
编辑:修正了变量名称。
看看这个问题的答案:
使用Python的 ast.literal_eval
可能对你很有帮助。它比 eval
更安全,因为它只会处理Python的数据字面量(比如字符串、元组等),而不会执行任何代码。
可以查看Python文档中的 ast.literal_eval。