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

Sai*_*hna 5 python json mongodb python-3.x

我正在尝试将数据从 SQL 移动到 Mongo。这是我面临的一个挑战,如果任何子对象为空,我想删除父元素。我想删除保险字段。

这是我尝试过的:

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


Run Code Online (Sandbox Code Playgroud)

样本数据

{
  "_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",
    
  }
}
Run Code Online (Sandbox Code Playgroud)

结果应该是这样的


{
  "_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",
    
  }
}
Run Code Online (Sandbox Code Playgroud)

Tra*_*nbi 2

你的 if 语句有点令人困惑。我认为你正在寻找递归:

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))
Run Code Online (Sandbox Code Playgroud)

编辑/注意:从Python3.8开始,您可以在推导式中使用赋值(:=

输出:

{
    "_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"
    }
}
Run Code Online (Sandbox Code Playgroud)