如何在python json字典中接受任何键?

时间:2019-01-26 20:00:04

标签: python json python-3.x parsing

这是我正在使用的JSON的简化版本:

{
  "libraries": [
    {
      "library-1": {
        "file": {
          "url": "foobar.com/.../library-1.bin"
        }
      }
    },
    {
      "library-2": {
        "application": {
          "url": "barfoo.com/.../library-2.exe"
        }
      }
    }
  ]
}

使用json,我可以json.loads()这个文件。我需要能够找到“ url”,将其下载,然后将其保存到本地库中。在这种情况下,我将在libraries/中创建两个文件夹,一个称为library-1,另一个library-2。在这些文件夹中将包含从url下载的内容。

但是,问题在于能够到达网址:

my_json = json.loads(...) # get the json

for library in my_json['libraries']:
    file.download(library['file']['url']) # doesn't access ['application']['url']

由于我使用的JSON使用了多种访问器,有时是“文件”,有时是“ dll”等,因此我不能使用一个特定的字典键。如何使用多个。会有模块化的方式来做到这一点吗?

编辑:有许多访问器,“文件”,“应用程序”和“ dll”只是一些示例。

4 个答案:

答案 0 :(得分:1)

尝试一下

for library in my_json['libraries']:
    if 'file' in library:
        file.download(library['file']['url'])
    elif 'dll' in library:
        file.download(library['dll']['url'])

它只是查看您的dict(通过解析JSON创建)是否具有名为'file'的密钥。如果是这样,则使用'url'中的dict对应于'file'键。如果不是,请尝试使用'dll'关键字。

编辑:如果您不知道访问包含URL的dict的密钥,请尝试此操作。

for library in my_json['libraries']:
    for key in library:
        if 'url' in library['key']:
            file.download(library[key]['url'])

这会遍历您的key中的所有library。然后,无论哪个key包含一个'url',都使用该文件进行下载。

答案 1 :(得分:1)

只要找到URL,您就可以遍历字典的每个级别并下载文件。

urls = []
for library in my_json['libraries']:
    for lib_name, lib_data in library.items():
        for module_name, module_data in lib_data.items():
            url = module_data.get('url')
            if url is not None:
                # create local directory with lib_name
                # download files from url to local directory
                urls.append(url)

# urls = ['foobar.com/.../library-1.bin', 'barfoo.com/.../library-2.exe']

答案 2 :(得分:1)

这应该有效:

for library in my_json['libraries']:
    for value in library.values():
        for url in value.values():
            file.download(url)

答案 3 :(得分:1)

我建议这样做:

for library in my_json['libraries']:
    library_data = library.popitem()[1].popitem()[1]
    file.download(library_data['url'])