查找dict中是否存在数组并且不为空

时间:2019-02-20 11:24:44

标签: python

我想检查JSON输入中是否存在元素,并且看起来下面的代码片段有效

import json
y = {
    "attributes": [
        {
            "name": "test"
        }
    ]
}

p2 = json.dumps(y)

if 'attributes' not in p2:
    print("not found")
else:
    print("found")

我现在要检查attribute元素是否为list类型和列表大小

实现此目标的Python方法是什么?

4 个答案:

答案 0 :(得分:3)

json.dumps的结果是JSON格式的字符串,因此,如果要搜索p2,则必须进行某种字符串匹配。即'attributes:[' in p2会匹配JSON中的某处,其中有一个“属性”键名,后跟一个数组。此解决方案并不是理想的选择,因为它无法处理JSON字符串格式不同(例如带有缩进格式)的情况。

Python方法是检查y本身,就像其他答案所建议的那样。即

('attributes' in y)  # True because it exists
(isinstance(y['attributes'], list))  # True because it's a list

最蟒蛇的方法就是简单地假设这是一个列表,如果您遇到一个失败则处理失败。

我还想向Marshmallow序列化库中快速添加一个消息。它旨在处理更复杂的模式验证任务,但是您也可以在此处应用它,以验证属性字段是否存在并映射到列表。即

y = { ... }  # like before...

from mashmallow import Schema, fields
class AttributesList(Schema):
    attributes = fields.List(fields.Dict())

al = AttributesList()
al.dumps(y)

答案 1 :(得分:0)

使用isinstance()检查类型,它将返回布尔值

y = {
    "attributes": [
        {
            "name": "test"
        }
    ]
}

# p2 = json.dumps(y)

if 'attributes' not in y:
    print("not found")

else:
    print(y['attributes'])
    print(isinstance(y['attributes'], list))
    if isinstance(y['attributes'], list):
        print('its a list')
        print(len(y['attributes']))
    print("found")

输出:

[{'name': 'test'}]
True
its a list
1
found

答案 2 :(得分:0)

您的代码段p2中是一个字符串(json.dumpsy转换为字符串中的有效JSON对象)

isinstance是首选的检查方式,因此您可以使用:

if isinstance(y['attributes'], list):
    len(y['attributes'])

答案 3 :(得分:0)

json_data = json.dumps({
    "attributes": [
        {
            "name": "test"
        }
    ]
})


item_dict = json.loads(json_data)
print(type((item_dict['attributes'])))    # list
print(len((item_dict['attributes'][0])))     # 1