如何从JSON中删除空对象和数组?

2024-06-16 08:45:17 发布

您现在位置:Python中文网/ 问答频道 /正文

{
    "_class": "org.jenkinsci.plugins.workflow.job.WorkflowRun",
    "actions": [
        {
            "date": "xyz",
            "lastBuiltRevision": {
                "branch": [
                    {
                        "SHA1": "5213affe970c86cd6e13b9d0e52515ac53f46aae",
                        "name": "feature/demo"
                    }
                ]
            }
        },
        {},
        {},
        {},
        {
            "date": "abc",
            "lastBuiltRevision": {
                "branch": [
                    {
                        "SHA1": "ca7972a32cc28304c22c98ceabf8e349fbf1a100",
                        "name": "refs/remotes/xyz/feature/demo_xyz"
                    }
                ]
            }
        },
        {
      "_class": "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    },
    {
      "_class": "org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction"
    },
    {},
    {
      "_class": "org.jenkinsci.plugins.workflow.job.views.FlowGraphAction"
    },
    {},
    {},
    {},
    {},
    {
      "_class": "org.marvelution.jji.export.ParentAction"
    }
    ]
}

JSON对象对于Jenkins multibranch管道来说太长了,所以我从JSON中共享了一些有限的对象

排除下列挑战后,我需要以下结果:

Name: refs/remotes/xyz/feature/demo_xyz, SHA1: ca7972a32cc28304c22c98ceabf8e349fbf1a100

上面的结果是,我使用下面的代码得到的,但为此,我删除了空白对象和其他不包含lastBuiltRevision

import JSON

with open('jenkinsBuild.json') as f:
    data = json.load(f)

branch_name="refs/remotes/xyz/feature/demo_xyz"

for actions in data['actions']:
    for branch_data in actions['lastBuiltRevision']['branch']:
        if branch_data['name'] == branch_name:
            print(f"Name: {branch_data['name']}, SHA1: {branch_data['SHA1']}")

挑战:

  1. 如果JSON中存在空对象,如何忽略它

  2. 如果JSON对象不包含lastBuiltRevision,那么如何忽略该对象

  3. 如果JSON包含一个空数组,那么如何忽略它


Tags: 对象nameorgactionsbranchjsondatademo
2条回答

你可以试试下面的方法

data = {
  "_class": "org.jenkinsci.plugins.workflow.job.WorkflowRun",
  "actions": [
    {
      "date": "xyz",
      "lastBuiltRevision": {
        "branch": [
          {
            "SHA1": "5213affe970c86cd6e13b9d0e52515ac53f46aae",
            "name": "feature/demo"
          }
        ]
      }
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      "date": "abc",
      "lastBuiltRevision": {
        "branch": [
          {
            "SHA1": "ca7972a32cc28304c22c98ceabf8e349fbf1a100",
            "name": "refs/remotes/xyz/feature/demo_xyz"
          }
        ]
      }
    },
    {
      "_class": "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    },
    {
      "_class": "org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction"
    },
    {
      
    },
    {
      "_class": "org.jenkinsci.plugins.workflow.job.views.FlowGraphAction"
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      "_class": "org.marvelution.jji.export.ParentAction"
    }
  ]
}
branch_name="refs/remotes/xyz/feature/demo_xyz"
data['actions'] = [x for x in data['actions'] if x and 'lastBuiltRevision' in x and x['lastBuiltRevision']['branch'][0]['name'] == branch_name]
for x in data.get('actions'):
  entry = x['lastBuiltRevision']['branch'][0]
  print(f'Name: {entry["name"]}, SHA1: {entry["SHA1"]}')

输出

Name: refs/remotes/xyz/feature/demo_xyz, SHA1: ca7972a32cc28304c22c98ceabf8e349fbf1a100

您的代码绝对正确,比您接受的答案中的示例要好得多。处理此类情况有两种方法:防止异常或处理异常

1。防止异常:

import json

with open('jenkinsBuild.json') as f:
    data = json.load(f)

branch_name = 'refs/remotes/xyz/feature/demo_xyz'

for actions in data['actions']:
    if 'lastBuiltRevision' in branch_data:  # empty dict doesn't have this key too
        for branch_data in actions['lastBuiltRevision']['branch']:
            if branch_data['name'] == branch_name:
                print('Name:', branch_data['name'], 'SHA1:', branch_data['SHA1'])

2。处理异常:

import json

with open('jenkinsBuild.json') as f:
    data = json.load(f)

branch_name = 'refs/remotes/xyz/feature/demo_xyz'

for actions in data['actions']:
    try:
        for branch_data in actions['lastBuiltRevision']['branch']:
            if branch_data['name'] == branch_name:
                print('Name:', branch_data['name'], 'SHA1:', branch_data['SHA1'])
    except KeyError:  # if any of accessed keys doesn't exist
        pass

相关问题 更多 >