How to recursively find specific key in nested JSON?
iteration, json, list-comprehension, python, recursion
Solution
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
This will create an iterator which will yield every value on any level under key "id". Example usage (printing all of those values):
for _ in id_generator(some_json_dict):
print(_)
Problem
I'm trying to pull nested values from a json file. I want to print out each of the values for every "id" key. I think I'm close but can't figure out why the obj type changes from a dict to a list, and then why I'm unable to parse that list. Here is a link to the json I'm working with: http://hastebin.com/ratevimixa.tex and here is my current code: ``` #!/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) ``` -------------------------------------------------------------------------------------------update This is now what I'm working with and it'll return a single id value, but not all of them: ``` #!/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 (_) ```