I have multi-levels json files with nested list and dictionnary inside, they look like this, but vary in size, and levels:
{
"mass_update": [
{
"lvl-1": "lvl-1.1"
},
{
"lvl-1": "lvl-1.2"
},
{
"lvl-1": "lvl-1.3"
},
[
{
"lvl-2": "lvl-2.1",
"lvl-2": "lvl-2.1.2"
},
[
{
"lvl-3": "lvl-3.1"
},
{
"lvl-3": "lvl-3.2"
},
[
{
"lvl-4": "lvl-4.1",
"lvl-4": "lvl-4.1.2"
},
{
"lvl-4": "lvl-4.2",
"lvl-4": "lvl-4.2.2"
}
]
],
{
"lvl-2": "lvl-2.2",
"lvl-2": "lvl-2.2.2"
},
[
{
"lvl-3": "lvl-3.3"
},
{
"lvl-3": "lvl-3.4"
},
[
{
"lvl-4": "lvl-4.3",
"lvl-4": "lvl-4.3.2"
},
{
"lvl-4": "lvl-4.4",
"lvl-4": "lvl-4.4.2"
}
]
]
]
]
}
I’m trying to read the json and print every single key value combination. When I’m at the end of a nested list, I would like to execute a function, let’s say for the moment one that do print("This is the end of the list, yay :-) )".
I tried some stuff, like creating a class that has a single var where I stock my dictionnary or my list:
class MassUpt:
def __init__(self, my_dict):
self.my_dict = my_dict
def get_my_dict(self):
return self.my_dict
I save the obj from the class inside a global list:
def get_obj(full_dict): #full_dict contains the list "mass_update" that is in all json files
for item in full_dict:
if isinstance(item, list):
obj_dict = MassUpt(item)
mass_upt_dict.append(obj_dict)
return get_obj(item)
else:
obj_dict = MassUpt(item)
mass_upt_dict.append(obj_dict)
print()
I then execute another function that is, for the moment, printing the key value combination:
def printing_obj_lst(full_dict):
lst_test = []
for item in full_dict:
lst_test.append(item.get_my_dict())
for item in lst_test:
if isinstance(item, list):
print("Calling next object")
else:
for k, v in item.items():
print("Key: " + str(k) + " Value: " + str(v))
Here is the main that I execute:
full_dict = mass_upt_res_data_json["mass_update"]
get_obj(full_dict)
printing_obj_lst(mass_upt_dict)
And here is my output:
Key: lvl-1 Value: lvl-1.1 Key: lvl-1 Value: lvl-1.2 Key: lvl-1 Value: lvl-1.3 Calling next object Key: lvl-2-1 Value: lvl-2.1.1 Key: lvl-2-2 Value: lvl-2.1.2 Calling next object Key: lvl-3 Value: lvl-3.1 Key: lvl-3 Value: lvl-3.2 Calling next object Key: lvl-4-1 Value: lvl-4.1 Key: lvl-4-2 Value: lvl-4.1.2 Key: lvl-4-1 Value: lvl-4.2 Key: lvl-4-2 Value: lvl-4.2.2
I don’t have all the key value combination printed, I don’t know if this is the good solution. It is important that I don’t flatten the json, as the end of list help me know when to execute a futur function. Sorry for the long post, thanks for taking your time to read !
Advertisement
Answer
Easy solution, you really need only a simple recursion if i get it right
full_dict = mass_upt_res_data_json["mass_update"]
def check_inst(elem):
for e in elem:
if isinstance(e, list):
print("list reached")
check_inst(e)
else:
for key, value in e.items() :
print (key, value)
check_inst(full_dict)
prints:
lvl-1 lvl-1.1 lvl-1 lvl-1.2 lvl-1 lvl-1.3 list reached lvl-2 lvl-2.1.2 list reached lvl-3 lvl-3.1 lvl-3 lvl-3.2 list reached lvl-4 lvl-4.1.2 lvl-4 lvl-4.2.2 lvl-2 lvl-2.2.2 list reached lvl-3 lvl-3.3 lvl-3 lvl-3.4 list reached lvl-4 lvl-4.3.2 lvl-4 lvl-4.4.2