编程语言
首页 > 编程语言> > python迭代json文件,其中json结构和键值未知

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

作者:互联网

考虑下面的示例JSON.

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

}

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

JSON_PATH = "D:\workspace\python\sampleJSON.json"
os.path.expanduser(JSON_PATH)

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

with open(JSON_PATH) as data_file:    
    data = json.load(data_file)

iterateAllKeys(data)

这里,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对象,我们不能应用’key.get()’.但是有没有其他方法可以迭代JSON文件而不指定任何键名.谢谢.

解决方法:

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

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

迭代第一个字典的键并打印每个键,如果该项是dict类的实例,我们可以使用递归来迭代我们作为项目遇到的字典.

标签:json,python,serialization,deserialization,getjson
来源: https://codeday.me/bug/20190611/1217851.html