Python вложенный json

Может ли кто-нибудь найти решение для этого, я хочу, чтобы api данные были в таком виде? Я хочу, чтобы api данные для одинаковых состояний приходили в одном бленде, а не в отдельных, данные для разных состояний могут быть разными obj,

    data = [{
        state_name:New_jersi, data:{
            category:Phishing,
            sub_cat_data:[{
                name:SubCat1,
                count:20
            },
            {
                name:SubCat2,
                count:30
            }]
        }
            category: malware,
            sub_cat_data:[{
                name:SubCat1,
                count:20
            },
            {
                name:SubCat2,
                count:30
            }]
    
    },
{
    state_name:Washinton, data:{
        category:Phishing,
        data:[{
            name:SubCat1,
            count:20
        },
        {
            name:SubCat2,
            count:30
        }]
    }
}]

But may api response be:


 {
            "state": "South Carolina",
            "state_count": 2,
            "Website Compromise/Intrusion": {
                "sub_category": {
                    "Insecure Direct Object Reference": 2,
                    "Memory Corruption": 2,
                    "SQLI": 1,
                    "Stack Overflow": 1,
                    "XSRF": 1,
                    "Heap Overflow": 1,
                    "Security Misconfiguration": 1
                }
            }
        },
        {
            "state": "South Carolina",
            "state_count": 1,
            "Phishing": {
                "sub_category": {
                    "Spear Phishing Attacks": 2,
                    "Fast Flux": 2,
                    "Rock fish": 2,
                    "Identify Theft/Social Engineering": 1,
                    "Phishing Redirector": 1,
                    "Pharming": 1,
                    "Exploitation of Hardware Vulnerability": 1
                }
            }
        },

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

Моя логика ниже

            cat_count = incnum.values('incident_category__cat_name','incident_category__cat_id').annotate(count=Count('incident_category__cat_id'))
            subcat_count = incnum.values('incident_sub_category__sub_cat_name','incident_sub_category__cat_id','incident_sub_category__id').annotate(count=Count('incident_sub_category__cat_id'))
            
            reporter_state_count1 = incnum.values('incident_category__cat_id','reporter__comp_individual_state','reporter__comp_individual_state__name').annotate(count=Count('incident_category__cat_id'))



            for x, state_ in enumerate(reporter_state_count1):
                for i, cat_ in enumerate(cat_count):
                    if state_['incident_category__cat_id'] == cat_['incident_category__cat_id']:
                        for i, cat_ in enumerate(cat_count):
                            if state_['incident_category__cat_id'] == cat_['incident_category__cat_id']:
                                arr16.append({'state':state_['reporter__comp_individual_state__name'], 'state_count':state_['count'], cat_['incident_category__cat_name']:{'sub_category':{}}})
                                for sub_ in subcat_count:
                                    if cat_['incident_category__cat_id'] == sub_['incident_sub_category__cat_id']:
                                        arr16[i][cat_['incident_category__cat_name']]['sub_category'].update({sub_['incident_sub_category__sub_cat_name']:sub_['count']})
cat_count = incnum.values('incident_category__cat_name', 'incident_category__cat_id').annotate(
    count=Count('incident_category__cat_id'))
subcat_count = incnum.values('incident_sub_category__sub_cat_name', 'incident_sub_category__cat_id',
                             'incident_sub_category__id').annotate(count=Count('incident_sub_category__cat_id'))

reporter_state_count1 = incnum.values('incident_category__cat_id', 'reporter__comp_individual_state',
                                      'reporter__comp_individual_state__name').annotate(
    count=Count('incident_category__cat_id'))

arr16 = []
for state_ in reporter_state_count1:
    state_data = {"state_name" : state_['reporter__comp_individual_state__name'], "data":[]}
    for cat_ in cat_count:
        if state_['incident_category__cat_id'] == cat_['incident_category__cat_id']:
            sub_cat_data = [{sub_['incident_sub_category__sub_cat_name']: sub_['count']} for sub_ in subcat_count if cat_['incident_category__cat_id'] == sub_['incident_sub_category__cat_id']]
            category_data = {"category": cat_['incident_category__cat_name'], "sub_cat_data": sub_cat_data}
            state_data["data"].append(category_data)

    arr16.append(state_data)

1 государство может иметь несколько категорий, но так, как вы пытаетесь сделать ваш api, он не сможет показать несколько категорий для государства. Поэтому я немного модифицирую. Вы найдете все категории в объекте state

Вернуться на верх