2011-06-03 40 views
1

使用django-social-auth从Facebook获取用户数据,它将返回一个unicode字符串中的字典列表。例如,对于用户response.get(“教育”)将返回:如何解析由python的facebook api返回的字典字符串列表?

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'}]"

我想这从一个字符串转换到一个列表,我可以提取数据,但我在努力。建议类似的问题(String to Dictionary in Python)的答案用:

foo=json.loads(string)

但失败,因为它是一个嵌套类型的字典列表,1为每所学校,而不仅仅是一个字典,它似乎是越来越糊涂。错误即时得到的是:

ValueError: Extra Data: line 1 column 73 - line 1 column 144

本来,我得到一个ValueError:期待物业名称:1号线,2列,直到我用与string.replace()来交换“与”,反之亦然。这并摆脱错误的,但我这不是正确的解决方案的情况下提

+0

它看起来像有一个逗号缺失'u'type'之前:u'College' – adamnfish 2011-06-03 17:05:46

+0

最大的问题是,这不是有效的JSON。除了缺少逗号之外,包含的字符串需要双引号,而不是单引号。 @见也http://stackoverflow.com/questions/4162642/python-single-vs-double-quotes-in-json – cwallenpoole 2011-06-03 17:11:26

+0

@adamnfish我手动在这里输入并错过了。固定 @cwallenpoole奇怪,这是从Facebook返回的方式,不知道为什么它不是有效的JSON。 – gatsby32 2011-06-03 19:22:26

回答

1

随着一点点重新格式化您可以使用类似:

uDictList = eval(inputString) 

可能不是最好的解决办法,但可能会有帮助

编辑:修正变量名称。

0

看起来您在提供的返回数据中存在拼写错误。这是最后u'type”

之前缺少一个逗号我不是100%肯定我明白你问什么,但我相信这是你的代码后

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)