'Parse output from json python

I have a json below, and I want to parse out value from this dict.

I can do something like this to get one specific value

print(abc['everything']['A']['1']['tree']['value'])

But, what is best way to parse out all "value?" I want to output good, bad, good.

   abc = {'everything': {'A': {'1': {'tree': {'value': 'good'}}}, 

'B': {'5': {'tree1': {'value': 'bad'}}},

'C': {'30': {'tree2': {'value': 'good'}}}}}


Solution 1:[1]

If you are willing to use pandas, you could just use pd.json_normalize, which is actually quite fast:

import pandas as pd
 
abc = {'everything': {'A': {'1': {'tree': {'value': 'good'}}}, 

'B': {'5': {'tree1': {'value': 'bad'}}},

'C': {'30': {'tree2': {'value': 'good'}}}}}

df = pd.json_normalize(abc)
print(df.values[0])
['good' 'bad' 'good']

Without any extra libraries, you will have to iterate through your nested dictionary:

values = [abc['everything'][e][k][k1]['value'] for e in abc['everything'] for k in abc['everything'][e] for k1 in abc['everything'][e][k]]
print(values)
['good', 'bad', 'good']

Solution 2:[2]

Provided your keys and dictionaries have a value somewhere, you can try this:

  • Create a function (or reuse the code) that gets the first element of the dictionary until the value key exists, then return that. Note that there are other ways of doing this.
  • Iterate through, getting the result under each value key and return.
# Define function
def get(d):
    while not "value" in d:
        d = list(d.values())[0]
    return d["value"]

# Get the results from your example
results = [get(v) for v in list(abc["everything"].values())]
['good', 'bad', 'good']

Solution 3:[3]

A Recursive way:

def fun(my_dict, values=[]):
    if not isinstance(my_dict, dict):
        return values

    for i, j in my_dict.items():
        if i == 'value':
            values.append(j)
        else:
            values = fun(j, values)
    return values


abc = {'everything': {'A': {'1': {'tree': {'value': 'good'}}},

                      'B': {'5': {'tree1': {'value': 'bad'}}},

                      'C': {'30': {'tree2': {'value': 'good'}}}}}
data = fun(abc)
print(data)

Output:
['good', 'bad', 'good']

Solution 4:[4]

Firstly, the syntax you are using is incorrect.

If you are using pandas, you can code like

import pandas as pd

df4 = pd.DataFrame({"TreeType": ["Tree1", "Tree2", "Tree3"], "Values": ["Good", "Bad","Good"]})

df4.index = ["A","B","C"]

next just run the code df4, you would get the correct output.

output:

TreeType    Values

A Tree1 Good B Tree2 Bad C Tree3 Good

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Larry the Llama
Solution 3 Mazhar
Solution 4 Sagar Urs G