【问题标题】:How to parse list of dictionaries string returned by facebook api with python?如何用python解析facebook api返回的字典字符串列表?
【发布时间】:2023-04-11 05:11:01
【问题描述】:

使用 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 蒙大拿大学'}, u'type': u'College'}]"

我想将其从字符串转换为可以提取数据的列表,但我很挣扎。建议使用类似问题 (String to Dictionary in Python) 的答案:

foo=json.loads(字符串)

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

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

最初,我得到一个 ValueError: Expecting Property Name: line 1, column 2,直到我使用 string.replace() 将“与”交换,反之亦然。这确实消除了那个错误,但是如果这不是正确的解决方案,我会提到。

【问题讨论】:

  • u'type'前面好像少了一个逗号:u'College'
  • 最大的问题是那不是有效的 JSON。除了缺少逗号之外,包含的字符串需要有双引号,而不是单引号。 @另见stackoverflow.com/questions/4162642/…
  • @adamnfish 我在这里手动输入但错过了。修复了@cwallenpoole 奇怪,这就是它从 facebook 返回的方式,不知道为什么它不是有效的 JSON。

标签: python django


【解决方案1】:

稍作重新格式化,您就可以使用如下内容:

uDictList = eval(inputString)

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

编辑:固定变量名。

【讨论】:

    【解决方案2】:

    看看这个问题的答案:

    Convert a String representation of a Dictionary to a dictionary?

    使用python的ast.literal_eval可能对你很有用。使用起来也比eval 安全得多,因为它只会评估python 数据文字(字符串、元组等),而不是可执行代码。

    请参阅 python 文档中的 ast.literal_eval

    【讨论】:

      【解决方案3】:

      您提供的返回数据中似乎有错字。最后一个 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-18
        • 2015-06-13
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多