iteración recursiva mediante json nested para clave específica en python

Estoy tratando de extraer valores nesteds de un archivo json. Quiero imprimir cada uno de los valores para cada tecla “id”. Creo que estoy cerca, pero no puedo entender por qué el tipo obj cambia de un dict a una lista, y luego por qué no puedo analizar esa lista. Aquí hay un enlace al json con el que estoy trabajando: http://hastebin.com/ratevimixa.tex

y aquí está mi código actual:

#!/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) 

————————————————– —————————————– actualización

Ahora es con lo que estoy trabajando y devolverá un único valor de identificación, pero no todos:

 #!/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 (_) 

 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 

Esto creará un iterador que rendirá cada valor en cualquier nivel bajo la clave “id”. Ejemplo de uso (imprimiendo todos esos valores):

 for _ in id_generator(some_json_dict): print(_) 

El JSON puede contener una lista de objetos, que debe buscarse:

Versión de 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 

Versión de 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)