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

python iterate json file where the json structure and key values are unknown

考虑下面的示例 JSON。

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

}

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

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)

returns 错误 - AttributeError:'unicode' 对象没有属性 'get'。我的理解是——由于 'child' 的值不是字典对象,我们不能应用 'key.get()'。但是有没有其他方法可以在不指定任何键名的情况下迭代 JSON 文件。谢谢。

您可以通过 flatten_json.

等辅助包来完成​​此操作

pip install flatten_json

from flatten_json import flatten

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

输出:

widget_test
widget_window_title
widget_window_name
widget_image_src
widget_image_name
os_name

如果你想只显示键而不显示整个路径,那么你可以这样做:

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

您可以像这样使用递归遍历多级字典:

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

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

首先是你的最后一个函数:

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

key 就是字典的key_value。所以如果有的话你应该使用 e.get(key) 或 e[key].

 for child in e.get(key):

现在这并不能解决您的问题,一种解决方法是使用 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---