需求:往往在接口对接的过程中,返回的json是很复杂的,里面来回嵌套各种list、dict。这时候需要获取某个key的所有value值,就显得很复杂,下面提供一个函数:

def extract_element_from_json(obj, path):
    '''
    输入关键字,就可以将关键字的值信息存放在列表中并输出
    如果关键字是对象名,则返回的对象字典信息到列表中
    如果关键字是列表名,则返回的列表信息到列表中(返回双重列表)
    '''
    def extract(obj, path, ind, arr):
        '''
        从一个嵌套的字典中提取一个元素,并返回到列表中。
        params: obj - dict - 输入字典
        params: path - list - 构成JSON路径的字符串列表
        params: ind - int - 起始索引
        params: arr - 列表 - 输出列表
        '''
        key = path[ind]
        if ind + 1 < len(path):
            if isinstance(obj, dict):
                if key in obj.keys():
                    extract(obj.get(key), path, ind + 1, arr)
                else:
                    arr.append(None)
            elif isinstance(obj, list):
                if not obj:
                    arr.append(None)
                else:
                    for item in obj:
                        extract(item, path, ind, arr)
            else:
                arr.append(None)
        if ind + 1 == len(path):
            if isinstance(obj, list):
                if not obj:
                    arr.append(None)
                else:
                    for item in obj:
                        arr.append(item.get(key, None))
            elif isinstance(obj, dict):
                arr.append(obj.get(key, None))
            else:
                arr.append(None)
        return arr
    if isinstance(obj, dict):
        return extract(obj, path, 0, [])
    elif isinstance(obj, list):
        outer_arr = []
        for item in obj:
            outer_arr.append(extract(item, path, 0, []))
        return outer_arr
        

a={
    "count": 5,
    "next": "null",
    "previous": "null",
    "results": [
        {
            "id": 1,
            "name": "社区",
            "desc": "null",
            "uid": 1,
            "on": False,
            "off_line_date": 0,
            "up_line_date": "null",
            "create_date": "2022-04-24 17:51:00",
            "device_list": [
                {
                    "id": 1,
                    "name": "风速变速器",
                    "desc": "哎哟,变速器啊",
                    "uid": 1,
                    "on": False,
                    "off_line_date": "null",
                    "up_line_date": "null",
                    "create_date": "2022-04-25 14:25:19",
                    "coor": "null"
                },
                {
                    "id": 2,
                    "name": "松下",
                    "desc": "哎哟,变速器啊哎哟,变速器啊",
                    "uid": 1,
                    "on": False,
                    "off_line_date": "null",
                    "up_line_date": "null",
                    "create_date": "2022-04-25 15:01:51",
                    "coor": "null"
                }
            ]
        }
    ]
}

# 调用
extract_element_from_json(a, ['results', 'device_list', 'name'])

#打印:['风速变速器', '松下']


感谢大佬,时间比较久,忘记是哪个大佬的博客地址了!