如何使用Python解析Facebook API返回的字典列表字符串?

1 投票
3 回答
1180 浏览
提问于 2025-04-16 18:55

在使用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 个回答

0

看起来你提供的返回数据里有个拼写错误。在最后的 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)
1

稍微调整一下格式,你可以使用类似下面的代码:

uDictList = eval(inputString)

这可能不是最好的解决办法,但或许能帮到你。

编辑:修正了变量名称。

3

看看这个问题的答案:

如何将字符串表示的字典转换为字典?

使用Python的 ast.literal_eval 可能对你很有帮助。它比 eval 更安全,因为它只会处理Python的数据字面量(比如字符串、元组等),而不会执行任何代码。

可以查看Python文档中的 ast.literal_eval

撰写回答