【问题标题】:python iterate json file where the json structure and key values are unknownpython迭代json文件,其中json结构和键值未知
【发布时间】:2017-08-02 16:15:30
【问题描述】:

考虑下面的示例 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' object has no attribute 'get'。我的理解是 - 由于“child”的值不是 dict 对象,我们不能应用“key.get()”。但是有没有其他方法可以在不指定任何键名的情况下迭代 JSON 文件。谢谢。

【问题讨论】:

    标签: python json serialization deserialization getjson


    【解决方案1】:

    你可以通过像 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])
    

    【讨论】:

      【解决方案2】:

      您可以使用递归来遍历多层字典,如下所示:

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

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

      【讨论】:

        【解决方案3】:

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

        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---
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-26
          • 2019-11-19
          • 1970-01-01
          • 1970-01-01
          • 2016-10-07
          • 1970-01-01
          • 1970-01-01
          • 2021-08-26
          相关资源
          最近更新 更多