How to find the required id in json

Question:

I have json

[
    {
        "id": 1116,
        "en_name": "Location, Surroundings",
        "children": [
            {
                "id": 819,
                "en_name": "Location Satisfaction",
                "children": []
            },
            {
                "id": 1004,
                "en_name": "Car Parking Facilities",
                "children": [
                    {
                        "id": 1297,
                        "en_name": "Availability and general perception of parking",
                        "children": []
                    }
                ]
            },
            {
                "id": 1123,
                "en_name": "On the road ",
                "children": []
            }
        ]
    }
]

I need to find the id and get the name.
For example, if I ask the algorithm to find a name by ID 1297, then it should give
me "Accessibility and general perception of parking".

The algorithm should run through the entire array of the dictionary and also run through all "children", which may also contain "children"

while True:
            for data in self.main_taxonomy:
                while len(data["children"]) != 0:
                    if data["id"] == id:
                        return data["name"]
                    else:
                        data = data["children"]

I tried to do it this way, but it didn’t check all the nesting.

Asked By: Tarodictrl

||

Answers:

Define a recursive function like this:

def recursive_find(id_, children):
    for child in children:
        if child.get('id')==id_:
            return child['en_name']
        res = recursive_find(id,child.get('children',[])
        if res:
            return res
    return None

This function will return a en_name property if id matches else returns None, call it on main array of your json like recursive_find(<your_id_here>, data)

Answered By: BSimjoo

This can be solved as a recursive function:

  • Loop over the entries.
  • Your base case, check if the entry has the ID you are looking for
  • Else, if the entry has children, check if any of them have the ID
  • Else, return None.
def find_element_by_id(entries, ID):
    for entry in entries:
        if entry["id"] == ID:
            return entry["en_name"]
        if entry["children"]:
            rtn = find_element_by_id(entry["children"], ID)
            if rtn:
                return rtn
    return None

Example use:

data = [
    {
        "id": 1116,
        "en_name": "Location, Surroundings",
        "children": [
            {
                "id": 819,
                "en_name": "Location Satisfaction",
                "children": []
            },
            {
                "id": 1004,
                "en_name": "Car Parking Facilities",
                "children": [
                    {
                        "id": 1297,
                        "en_name": "Availability and general perception of parking",
                        "children": []
                    }
                ]
            },
            {
                "id": 1123,
                "en_name": "On the road ",
                "children": []
            }
        ]
    }
]

ret1 = find_element_by_id(data, 1297)
print(ret1)

Output:

Availability and general perception of parking
Answered By: Tom McLean
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.