Home > Blockchain >  How to remove parent json element in python3 if child is object is empty
How to remove parent json element in python3 if child is object is empty

Time:10-07

I'm trying to move data from SQL to Mongo. Here is a challenge I'm facing, if any child object is empty I want to remove parent element. I want till insurance field to be removed.

Here is what I tried:

def remove_empty_elements(jsonData):
    if(isinstance(jsonData, list) or isinstance(jsonData,dict)):

        for elem in list(jsonData):
            if not isinstance(elem, dict) and isinstance(jsonData[elem], list) and elem:
                jsonData[elem] = [x for x in jsonData[elem] if x]
                if(len(jsonData[elem])==0):
                    del jsonData[elem]
            elif not isinstance(elem, dict) and isinstance(jsonData[elem], dict) and not jsonData[elem]:
                del jsonData[elem]
    else:
        pass
    return jsonData


sample data

{
  "_id": "30546c62-8ea0-4f1a-a239-cc7508041a7b",
  "IsActive": "True",
  "name": "Pixel 3",
  "phone": [
    {
      "Bill": 145,
      "phonetype": "xyz",
      "insurance": [
        {
          "year_one_claims": [
            {
             "2020": 200 
            },
            {
              
            },
            {
              
            },
            {
              
            },
            {
              
            }
          ]
        },
        {
          "year_two_claims": [
            {
              
            },
            {
              
            },
            {
              
            },
            {
              
            },
            {
              
            }
          ]
        },
        
      ]
    }
  ],
  "Provider": {
    "agent": "aaadd",
    
  }
}

Results should look like that


{
  "_id": "30546c62-8ea0-4f1a-a239-cc7508041a7b",
  "IsActive": "True",
  "name": "Pixel 3",
  "phone": [
    {
      "Bill": 145,
      "phonetype": "xyz",
      "insurance": [
        {
          "year_one_claims": [
            {
             "2020": 200 
            },
           
          ]
        },
       
        
      ]
    }
  ],
  "Provider": {
    "agent": "aaadd",
    
  }
}

CodePudding user response:

Your if statements are kind of confusing. I think you are looking for a recursion:

import json

def remove_empty_elements(jsonData):
    if isinstance(jsonData, list):
        jsonData = [new_elem for elem in jsonData
                    if (new_elem := remove_empty_elements(elem))]
   
    elif isinstance(jsonData,dict):
        jsonData = {key: new_value for key, value in jsonData.items()
                    if (new_value := remove_empty_elements(value))}

    return jsonData

print(json.dumps(remove_empty_elements(jsonData), indent=4))

Edit/Note: from Python3.8 you can use assignements (:=) in comprehensions

Output:

{
    "_id": "30546c62-8ea0-4f1a-a239-cc7508041a7b",
    "IsActive": "True",
    "name": "Pixel 3",
    "phone": [
        {
            "Bill": 145,
            "phonetype": "xyz",
            "insurance": [
                {
                    "year_one_claims": [
                        {
                            "2020": 200
                        }
                    ]
                }
            ]
        }
    ],
    "Provider": {
        "agent": "aaadd"
    }
}

CodePudding user response:

Try out this:

data = {
  "_id": "30546c62-8ea0-4f1a-a239-cc7508041a7b",
  "IsActive": "True",
  "name": "Pixel 3",
  "phone": [
    {
      "Bill": 145,
      "phonetype": "xyz",
      "insurance": [
        {
          "year_one_claims": [
            {
             "2020": 200 
            },
            {
              
            },
            {
              
            },
            {
              
            },
            {
              
            }
          ]
        },
        {
          "year_two_claims": [
            {
              
            },
            {
              
            },
            {
              
            },
            {
              
            },
            {
              
            }
          ]
        },
        
      ]
    }
  ],
  "Provider": {
    "agent": "aaadd",
    
  }
}
for phn_data in data['phone']:
    for ins in phn_data['insurance']:
        for key, val in list(ins.items()):
            for ins_data in list(val):
                if not ins_data:
                    val.remove(ins_data)
            if not val:
                del ins[key]
                phn_data['insurance'].remove(ins)
                    
print (data)

Output:

{
    '_id': '30546c62-8ea0-4f1a-a239-cc7508041a7b',
    'IsActive': 'True',
    'name': 'Pixel 3',
    'phone': [{
        'Bill': 145,
        'phonetype': 'xyz',
        'insurance': [{
            'year_one_claims': [{
                '2020': 200
            }]
        }]
    }],
    'Provider': {
        'agent': 'aaadd'
    }
}
  • Related