Как принять любой ключ в словаре Python JSON? - PullRequest
0 голосов
/ 26 января 2019

Вот упрощенная версия JSON, с которым я работаю:

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

Используя json, я могу json.loads() этот файл. Мне нужно найти URL-адрес, загрузить его и сохранить в локальной папке с именем library. В этом случае я бы создал две папки внутри libraries/, одну с именем library-1, другую library-2. В этих папках будет все, что было загружено с URL.

Проблема, однако, не в том, чтобы добраться до 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» и т. Д., Я не могу использовать один конкретный ключ словаря. Как я могу использовать несколько. Будет ли модульный способ сделать это?

Редактировать: Есть многочисленные методы доступа, «file», «application» и «dll» - только некоторые примеры.

Ответы [ 4 ]

0 голосов
/ 26 января 2019

Я бы предложил сделать это так:

for library in my_json['libraries']:
    library_data = library.popitem()[1].popitem()[1]
    file.download(library_data['url'])
0 голосов
/ 26 января 2019

Вы можете просто перебирать каждый уровень словаря и загружать файлы, если найдете 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']
0 голосов
/ 26 января 2019

Это должно работать:

for library in my_json['libraries']:
    for value in library.values():
        for url in value.values():
            file.download(url)
0 голосов
/ 26 января 2019

Попробуйте это

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

Редактировать : Если вы не знаете ключ для доступа к dict, содержащему URL, попробуйте это.

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

Это повторяет все key в вашем library. Затем, в зависимости от того, что key содержит 'url', загружаются с использованием этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...