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)
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 (_)
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(_)
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)