Python遍历任何JSON对象以获取所有键值的函数

2024-09-25 18:22:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个通用函数来处理任何以array或dict开头的json对象

我想知道是否有一种更优雅的方法使用生成器函数的yield/yield来实现同样的功能

jsonobj1 = {
    'fruit':
        {'Apples': 1}
}

jsonobj2 = [{
    "fruitbasket": "fruitbasket1",
},
    {
    "fruitbasket2": "fruitbasket2",
    "Apples": {
        "Green": 1,
        "Red": 2
    },
}
]

jsonobj3 = [{
    "fruitbasket": "fruitbasket1",
},
    {
    "fruitbasket2": "fruitbasket2",
    "Apples": {
        "Green": 1,
        "Red": 2
    },
    "Bananas": ['Yellow', 'Green'],
    "Bananas": [
        {"Brand": 3},
        {
            "Chiquita": 3,
            "Stock": {
                "Stockamount": 4,
                "Customer": "Supermarkets",
            }
        }
    ]
}
]

def recursive_items(dictionary):
    for key, value in dictionary.items():
        if type(value) is dict:
            yield from recursive_items(value)
        else:
            yield (key, value)


def kvpairs(jsonobj):
    if isinstance(jsonobj, dict):
        for key, value in recursive_items(jsonobj):
            if type(value) is list:
                for item in value:
                    if type(item) == dict:
                        for key, value in recursive_items(item):
                            print('{}={}'.format(key, value))
            else:
                print('{}={}'.format(key, value))
    if isinstance(jsonobj, list):
        for d in jsonobj:
            for key, value in recursive_items(d):
                if type(value) is list:
                    for i in value:
                        if type(i) == dict:
                            for key, value in recursive_items(i):
                                print('{}={}'.format(key, value))
                else:
                    print('{}={}'.format(key, value))


kvpairs(jsonobj3)

输出:

fruitbasket=fruitbasket1
fruitbasket2=fruitbasket2
Green=1
Red=2
Brand=3
Chiquita=3
Stockamount=4
Customer=Supermarkets

我们也在使用python benedict traverse函数进行测试,但这不适用于具有嵌套列表的json对象


Tags: keyinformatforifvaluetypeitems