简体   繁体   English

如果子对象为空,如何在python3中删除父json元素

[英]How to remove parent json element in python3 if child is object is empty

I'm trying to move data from SQL to Mongo.我正在尝试将数据从 SQL 移动到 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",
    
  }
}

Your if statements are kind of confusing.您的 if 语句有点令人困惑。 I think you are looking for a recursion:我认为您正在寻找递归:

import json

# define which elements you want to remove:
to_be_deleted = [[], {}, "", None]

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

    return jsonData

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

Edit/Note: from Python3.8 you can use assignements ( := ) in comprehensions编辑/注意:从 Python3.8 开始,您可以在理解中使用赋值( :=

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"
    }
}

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'
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM