python迭代json文件,其中json结构和键值未知

2024-10-01 17:36:55 发布

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

考虑下面的示例JSON。在

{
"widget": {
    "test": "on",
    "window": {
        "title": "myWidget1",
        "name": "main_window"
    },
    "image": {
        "src": "Images/wid1.png",
        "name": "wid1"
    }
},
"os":{
    "name": "ios"
}

}

考虑一下我们不知道JSON和任何键的结构的情况。我需要实现的是一个python函数,它遍历所有键和子键并打印键。也就是说,通过只知道JSON文件名,我应该能够迭代整个键和子键。JSON可以是任何结构。什么我试过的如下。在

^{pr2}$

这里,iterateAllKeys()函数应该打印JSON文件中存在的所有键。但如果只存在外环

def iterateAllKeys(e):
    for key in e.iterkeys():
        print key

它将打印键“widget”和“os”。但是

def iterateAllKeys(e):
    for key in e.iterkeys():
        print key
        for child in key.get(key):
            iterateAllKeys(child)

返回错误-AttributeError:“unicode”对象没有属性“get”。我的理解是-因为'child'的值不是dict对象,我们不能应用'钥匙。得到()'. 但是有没有其他方法可以在不指定任何键名的情况下迭代JSON文件。谢谢您。在


Tags: key函数nameinjsonchildforos
3条回答

首先,你的最后一个功能是:

def iterateAllKeys(e):
    for key in e.iterkeys():
        print key
        for child in key.get(key):
            iterateAllKeys(child)

key只是字典的key_值。因此,如果有任何问题,您应该使用e.get(key)或e[key]。在

^{2}$

现在这并不能解决您的问题,一种解决方法是使用try except,如下所示:

def iterateAllKeys(e):
    for key in e.iterkeys():
        print key
        try:
            iterateAllKeys(e[key])
        except:
            print " -SKIP -"

这也许不是最好的解决办法,但它确实有效。 使用您的数据,它将打印以下内容:

widget
test
 -SKIP -
window
name
 -SKIP -
title
 -SKIP -
image
src
 -SKIP -
name
 -SKIP -
os
name
 -SKIP -

您可以通过flant_json这样的辅助包来实现这一点。在

pip install flatten_json

from flatten_json import flatten

for key in flatten(your_dict).keys():
    print(key)

输出:

^{2}$

如果只想显示没有整个路径的关键点,则可以这样做:

print(key.split('_')[-1])

您可以使用递归来迭代多级字典,如下所示:

def iter_dict(dic):
    for key in dic:
        print(key)
        if isinstance(dic[key], dict):
            iter_dict(dic[key])

第一个字典的键被迭代,每个键都被打印出来,如果条目是dict类的一个实例,我们可以使用递归来迭代我们遇到的字典作为条目。在

相关问题 更多 >

    热门问题