You could write a few utility functions that recursively drill down the structure to access any specific value, keys or items. This could process lists as if they were dictionaries with the keys being the indices.
def deepValue(D,key,*rest,default=None):
try: return deepValue(D[key],*rest,default=default) if rest else D[key]
except: return default
def deepKeys(D,key,*rest):
try:
return deepKeys(D[key],*rest) if rest \
else D[key].keys() if isinstance(D[key],dict) \
else range(len(D[key]))
except:
return []
def deepItems(D,key,*rest):
try:
if rest:
yield from deepItems(D[key],*rest)
elif isinstance(D[key],dict):
yield from D[key].items()
else:
yield from enumerate(D[key])
except: return
output:
for k in deepKeys(json_structure,"c",0):
print(k)
# d
# e
# f
print(deepValue(json_structure,"c",0))
# {'d': 4, 'e': 5, 'f': {'g': 6}}
print(deepValue(json_structure,"c",0,"d"))
# 4
for k,v in deepItems(json_structure,"c",0):
print(k,v)
# d 4
# e 5
# f {'g': 6}