递归获取嵌套json 的所有key及value值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import json
 
class Get_Dict_All_Keyvalue:
    """ 递归获取多维嵌套字典所有层级的key和value """
    def __init__(self, analysis_dict):
        #判断类型,如果是str的需要进行loads处理
        self.res_dict = {}
         
        self.key_name_set = set()
        #self.key_name_unique = True
         
        if isinstance(analysis_dict, dict):
            self.recur_dict(analysis_dict)
        if isinstance(analysis_dict, str):
            self.recur_dict(json.loads(analysis_dict))
 
    def recur_dict(self, ana_dict: dict, key_name=""):
        """多维/嵌套字典数据无限遍历,获取所有key层和value"""
        # 使用isinstance检测数据类型:字典类型
        if isinstance(ana_dict, dict):
            for k, v in ana_dict.items():
                if key_name == "":
                    self.recur_dict(v, k)
                else:
                    self.recur_dict(v, key_name+f"_{k}")
        # 列表或元组类型
        elif isinstance(ana_dict, (list, tuple)):
            if len(ana_dict) == 1:
                for i in range(len(ana_dict)):
                    # 自我调用实现无限遍历,单个不加修饰
                    if isinstance(ana_dict[0], dict):
                        self.recur_dict(ana_dict[i], key_name)
                    else:
                        print(key_name + "=" + str(ana_dict))
                        self.res_dict[key_name] = str(ana_dict)
                        break
            else:
                for i in range(len(ana_dict)):
                    #判断下列表的元素是不是还是字典,如果是字典那就继续下钻,否则就是终端值
                    if isinstance(ana_dict[0], dict):
                        # 自我调用实现无限遍历,多个增加字母修饰
                        self.recur_dict(ana_dict[i], key_name+f"_{i}")
                    else:
                        print(key_name + "=" + str(ana_dict))
                        self.res_dict[key_name] = str(ana_dict)
                        break
        else:
            print(key_name + "=" + str(ana_dict))
            self.res_dict[key_name] = str(ana_dict)
             
            last_key_name = key_name.split('_')[-1]
             
            if last_key_name not in self.key_name_set:
                self.key_name_set.add(last_key_name)
            else:
                print('重复key', last_key_name)
             
if __name__ == "__main__":
    test_dic = {"name": "zhangsan", "address": {"sheng": "beijing", "shiji": "beijing", "shiqu": ["shijingshan", "p"], "qu": {"1dong": "1", "2dong": "2"}}}
     
    t = Get_Dict_All_Keyvalue(test_dic) # 传入空字典{},即ana_dicts初始值为{}
    print(t.res_dict)
    print(t.res_dict.keys())
    print(t.res_dict.values())

  

posted on   帅胡  阅读(181)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2017-07-31 CTP交易函数大全

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示