使用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”,反之亦然。这确实消除了这个错误,但是我提到的不是正确的解决方案。
答案 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)