web-dev-qa-db-fra.com

itération récursive via json imbriqué pour une clé spécifique dans python

J'essaie d'extraire des valeurs imbriquées d'un fichier json. Je veux imprimer chacune des valeurs pour chaque clé "id". Je pense que je suis proche, mais je ne peux pas comprendre pourquoi le type obj passe d'un dict à une liste, puis pourquoi je ne peux pas analyser cette liste. Voici un lien vers le json avec lequel je travaille: http://hastebin.com/ratevimixa.tex

et voici mon code actuel:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import json

json_data = open('JubJubProductions.json', 'r+')
jdata = json.loads(json_data.read().decode("utf-8"))

def recursion(dict):

    for key, value in dict.items():

        if type(value) == type(dict):
            if key != "paging":
                for key, value in value.items():
                    if isinstance (value,list):
                        print key
                        # place where I need to enter list comprehension?
                if type(value) == type(dict):
                    if key == "id":
                        print " id found " + value
                    if key != "id":
                        print key + " 1st level"
                if key == "id":
                    print key
        else:
            if key == "id":
                print "id found " + value       
if __name__ == '__main__':
    recursion(jdata)

-------------------------------------------------- ----------------------------------------- mise à jour

C'est maintenant ce avec quoi je travaille et il retournera une seule valeur id, mais pas tous:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import json

json_data = open('jubjubProductions', 'r+')
jdata = json.loads(json_data.read().decode("utf-8"))

def id_generator(d):
    for k, v in d.items():
        if k == "id":
            yield v
        Elif isinstance(v, dict):
            for id_val in id_generator(v):
                yield id_val

if __name__ == '__main__':
    for _ in id_generator(jdata):
        print (_)
19
adam
def id_generator(dict_var):
      for k, v in dict_var.items():
            if k == "id":
                 yield v
            Elif isinstance(v, dict):
                 for id_val in id_generator(v):
                       yield id_val

Cela créera un itérateur qui donnera chaque valeur à n'importe quel niveau sous la clé "id". Exemple d'utilisation (impression de toutes ces valeurs):

for _ in id_generator(some_json_dict):
     print(_)
13
Filip Malczak

Le JSON peut contenir une liste d'objets, qui doit être recherchée:

Version Python 2.7:

def item_generator(json_input, lookup_key):
    if isinstance(json_input, dict):
        for k, v in json_input.iteritems():
            if k == lookup_key:
                yield v
            else:
                for child_val in item_generator(v, lookup_key):
                    yield child_val
    Elif isinstance(json_input, list):
        for item in json_input:
            for item_val in item_generator(item, lookup_key):
                yield item_val

Version Python 3.x:

def item_generator(json_input, lookup_key):
    if isinstance(json_input, dict):
        for k, v in json_input.items():
            if k == lookup_key:
                yield v
            else:
                yield from item_generator(v, lookup_key)
    Elif isinstance(json_input, list):
        for item in json_input:
            yield from item_generator(item, lookup_key)
18
Bo Sunesen