迭代python字典中的键值对来构建对象列表

时间:2015-12-04 16:57:06

标签: python json flask

enter image description here

我需要将一些对象发布到烧瓶应用中,其中每个对象由2个键值对组成。

我正在使用邮递员测试发送1个对象作为json,但是我需要能够发送多个对象(每个对象都是由2 kv对组成,如截图所示)

我的烧瓶应用程序如下:

json = request.get_json(force=True) # receives request from postman
for j in json:
        print str(j)

test = [{'a': j['key1'], 'token':j['key2']} for j in json ]

我想将json重建为一个包含2 kv对的词典的列表('test')(即每个词组都是一个对象)。

不幸的是我意识到因为上面的json是

{u'key2': u'xyz', u'key1': u'abc'}

我得到了:

TypeError: string indices must be integers

请参阅TypeError: string indices must be integers with flask json

在这种情况下,只有一个对象,但如何迭代json变量来构建我需要的dics列表?

2 个答案:

答案 0 :(得分:1)

让我解构代码,假设json是一个包含数据{u'key2': u'xyz', u'key1': u'abc'}的字典

test = [{'a': j['key1'], 'token':j['key2']} for j in json ]

你实际上在做的是迭代字典中的键,然后将结果视为字典,这会给你一个错误!

每个循环中j中的json是关键,因此在第一次迭代中,您获得结果'key1',当您尝试j['key1']时,您认为j 1}}是一个字典,但实际上它是一个字符串,因此错误TypeError: string indices must be integers

这可能是您正在寻找的帮助您解决方案的方法。

这将为您提供词典列表:

test = [{key, value} for key, value in json.items()]

结果:

[{u'key2': u'xyz'}, {u'key1': u'abc'}]

您的代码失败的原因是因为您尝试不必要地遍历字典,但如果您想要反汇编它,只需执行此操作:

[dict(a=json['key1'], token=json['key2'])]

结果:

[{'a': u'abc', 'token': u'xyz'}]

答案 1 :(得分:1)

我只是想找到一种方法让代码更具容错能力并能够处理单个和多个对象

这样做的简单方法是检查进入的数据类型,并将其更改为其他代码可以使用的标准化表单。如果您获得dict,只需创建一个list来保存dict,其余代码就可以使用。

json = request.get_json(force=True) # receives request from postman
for j in json:
        print str(j)

if isinstance(json, dict):
    json = [json]
test = [{'a': j['key1'], 'token':j['key2']} for j in json ]