如何用python解析facebook api返回的字典字符串列表?

时间:2011-06-03 16:52:31

标签: python django

使用django-social-auth从facebook获取用户数据,它返回一个unicode字符串中的dicts列表。例如,用户的response.get('education')正在返回:

  

你“[{u'school':{u'id':u'12345',   你叫'u'Joe Thiesman High'},   你''''你'高中'},{u'school':   {u'id':u'23456',u'name':你的.Joe   蒙大拿大学'},u'type':   u'College'}]“

我想将它从字符串转换为我可以提取数据的列表,但我正在努力。对类似问题(String to Dictionary in Python)的回答建议使用:

  

富= json.loads(字符串)

但是失败了,因为它有一个带有嵌套dicts的列表,每个学校只有1个,而不仅仅是一个字典,而且它似乎变得混乱了。我得到的错误是:

  

ValueError:额外数据:第1行第73行 - 第1行第144列

最初,我得到一个ValueError:期待属性名称:第1行第2列,直到我使用string.replace()来交换“with”,反之亦然。这确实消除了这个错误,但是我提到的不是正确的解决方案。

3 个答案:

答案 0 :(得分:3)

看看这个问题的答案:

Convert a String representation of a Dictionary to a dictionary?

使用python的ast.literal_eval可能对你非常有用。使用它比eval更安全,因为它只会评估python数据文字(字符串,元组等...),但不会评估可执行代码。

请参阅python文档中的ast.literal_eval

答案 1 :(得分:1)

稍微重新格式化就可以使用以下内容:

uDictList = eval(inputString)

可能不是最佳解决方案,但可能有所帮助。

编辑:修正了变量名称。

答案 2 :(得分:0)

您提供的返回数据中似乎有拼写错误。在最后一次'''之前它缺少一个逗号

我不是百分百肯定我明白你在问什么,但我相信这是你追求的代码

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)