Создание цикла для подкатегорий

Имею json список объектов и беда в том что в нем есть подкатегории. Казалось бы вытянул название категории, вытянул подкатегории, но не могу создать цикл для подкатегории, и вообще все это превращается в кашу малашу из-за недостатка опыта в создании циклов. Помогите пожалуйста верно вывести данные.

category_usbAndDisks = catalogData[3]
category_usbAndDisks_childrens = category_usbAndDisks['childrens']
category_usbAndDisks_childrens_childrens = category_usbAndDisks_childrens[0]

# ФЛЭШ ПАМЯТЬ, ВНЕШНИЕ ДИСКИ, ПРИВОДЫ
name = category_usbAndDisks['name']
id = category_usbAndDisks['id']
current_catalogData = {
    "categoryid": id,
    "externalid": id,
    "name": name,
    "parentcategory": parentId
}
completed_data = json.dumps(raw_data_list)
raw_data_list.append(current_catalogData)
parentId = 0

# Выгрузка подкатегорий категории ФЛЭШ ПАМЯТЬ, ВНЕШНИЕ ДИСКИ, ПРИВОДЫ
for i in category_usbAndDisks_childrens:
    name = i['name']
    id = i['id']
    parentId = i['parentId']

    catalog_data = {
        "categoryid": id,
        "externalid": id,
        "name": name,
        "parentcategory": parentId
    }

    raw_data_list.append(catalog_data)
    completed_data = json.dumps(raw_data_list)

#Здесь начинается неудачная попытка вывести подкатегорию подкатегории.
    childrens = []
    for i in category_usbAndDisks_childrens[i]:
        for i in category_usbAndDisks_childrens['childrens']:
            name = i['name']
            id = i['id']
            parentId = i['parentId']

            catalog_data = {
                "categoryid": id,
                "externalid": id,
                "name": name,
                "parentcategory": parentId
            }

            childrens.append(catalog_data)
            completed_data = json.dumps(childrens)
    i += 1

Вид json файла откуда вытягиваю данные:


Ответы (2 шт):

Автор решения: Came Up

Если я правильно понял, то тебе нужен последний уровень вложенности
Твой JSON мне нужен был чтобы не писать то, что в твоем скриншоте
В файле test.json у меня вот этот кусок твоего JSON-файла


Код:

from json import load
from pprint import pprint

with open("test.json", "r", encoding="utf-8") as f:
    data = load(f)

data_subcategories = [item for item in data["childrens"][0]["childrens"]]

pprint(data_subcategories)

Результат:

[{'id': 180, 'leaf': True, 'name': '2 GB', 'parentId': 165},
 {'id': 182, 'leaf': True, 'name': '4 GB', 'parentId': 165},
 {'id': 183, 'leaf': True, 'name': '8 GB', 'parentId': 165},
 {'id': 184, 'leaf': True, 'name': '16 GB', 'parentId': 165},
 {'id': 185, 'leaf': True, 'name': '32 GB', 'parentId': 165},
 {'id': 186, 'leaf': True, 'name': '64 GB и более', 'parentId': 165}]

В следующий раз, пожалуйста, пиши конкретнее, что нужно вывести

→ Ссылка
Автор решения: CrazyElf
for i in category_usbAndDisks_childrens:
    for i in category_usbAndDisks_childrens[i]:
        for i in category_usbAndDisks_childrens['childrens']:

У вас проблемы из-за того, что:

  • вы называете переменные во всех циклах одинаково, так что они "перекрывают" друг друга (ещё и называете не "говорящим" именем i, что бывает допустимо, но не в этом случае)
  • вы не очень понимаете, что хотите сделать

Конструкция циклов должна быть примерно такая, чтобы вы начали во всём этом разбираться:

for category in category_usbAndDisks:
    print('Category name', category['name'])
    ...
    for subcategory in category['childrens']:
        print('Subcategory name', subcategory['name'])
        ...
        for items in subcategory['childrens']:
            print('Item name', item['name'])
            ...

Т.е.:

  • называете перебираемые в цикле сущности понятным образом
  • используете внутри цикла эту сущность, в том числе для работы с вложенными в неё другими сущностями через вложенный цикл

Это не всегда оптимальный вариант перебора объектов json, но от него можно начать хоть куда-то двигаться и понимать, что вы делаете.

→ Ссылка