Voici une version simplifiée du JSON avec lequel je travaille:

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

En utilisant json, je peux json.loads() ce fichier. J'ai besoin de pouvoir trouver l'url, la télécharger et l'enregistrer dans un dossier local appelé bibliothèque. Dans ce cas, je créerais deux dossiers dans libraries/, l'un appelé library-1, l'autre library-2. Dans ces dossiers, il y aurait tout ce qui a été téléchargé depuis l'URL.

Le problème, cependant, est de pouvoir accéder à l'URL:

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

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

Étant donné que le JSON que j'utilise utilise une variété d'accesseurs, parfois «fichier», parfois «dll», etc., je ne peux pas utiliser une clé de dictionnaire spécifique. Comment puis-je utiliser plusieurs. Y aurait-il une façon modulaire de procéder?

Edit: Il existe de nombreux accesseurs, 'file', 'application' et 'dll' ne sont que quelques exemples.

2
Frontear 26 janv. 2019 à 23:00

4 réponses

Meilleure réponse

Vous pouvez simplement parcourir chaque niveau du dictionnaire et télécharger les fichiers si vous trouvez une 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']
1
Andrew L 26 janv. 2019 à 20:14

Essaye ça

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

Il voit simplement si votre dict (créé en analysant JSON) a une clé nommée 'file'. Si c'est le cas, alors utilisez 'url' de la dict correspond à la clé 'file'. Sinon, essayez la même chose avec le mot clé 'dll'.

Modifier : si vous ne connaissez pas la clé pour accéder au dict contenant l'URL, essayez ceci.

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

Cela itère sur tous les key de votre library. Ensuite, quel que soit le key contenant un 'url', les téléchargements sont effectués à partir de cela.

1
Parvez M Robin 28 janv. 2019 à 06:14

Je suggère de le faire comme ceci:

for library in my_json['libraries']:
    library_data = library.popitem()[1].popitem()[1]
    file.download(library_data['url'])
1
martineau 26 janv. 2019 à 22:07

Cela devrait fonctionner:

for library in my_json['libraries']:
    for value in library.values():
        for url in value.values():
            file.download(url)
1
Valery Ramusik 26 janv. 2019 à 20:15