使用Python迭代嵌套的JSON数据

2024-10-03 19:30:21 发布

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

任务: 我正在使用API调用从我们的TeamCity CI工具获取JSON数据。 我们需要识别所有使用旧版本msbuild的构建。 我们可以从这个API调用数据中识别 { "name": "msbuild_version", "value": "15.0" } 目前,我正在将整个API调用数据保存到一个文件中;不过,稍后我将把API调用集成到同一个脚本中。 现在来谈谈眼前的问题;如何筛选上述属性,即msbuild\u version,也就是说msbuild\u version<;15.0(即所有版本低于15.0的msbuild),并在“buildType”下显示相应的“id”和“projectName”;e、 g

"id": "AIntegration_BTool_BToolBuilds_DraftBuild",
"projectName": "A Integration / B Tool / VAR Builds",

以下是JSON数据文件的一部分:-

{
    "project": [{
        "id": "_Root",
        "buildTypes": {
            "buildType": []
        }
    }, {
        "id": "AI_BTool_BToolBuilds",
        "buildTypes": {
            "buildType": [{
                "id": "AI_BTool_BToolBuilds_DraftBuild",
                "projectName": "A I / B Tool / VAR Builds",
                "steps": {
                    "step": [ {
                        "id": "RUNNER_213",
                        "name": "Build",
                        "type": "MSBuild",
                        "properties": {
                            "property": [ {
                                "name": "msbuild_version",
                                "value": "16.0"
                            }, {
                                "name": "run-platform",
                                "value": "x64"
                            }, {
                                "name": "targets",
                                "value": "Build"
                            }, {
                                "name": "teamcity.step.mode",
                                "value": "default"
                            }, {
                                "name": "toolsVersion",
                                "value": "15.0"
                            }]
                        }
                    }, {
                        "id": "RUNNER_228",
                        "name": "temp",
                        "type": "VS.Solution",
                        "properties": {
                            "property": [{
                                "name": "build-file-path",
                                "value": "x"
                            }, {
                                "name": "msbuild_version",
                                "value": "16.0"
                            }, {
                                "name": "vs.version",
                                "value": "vs2019"
                            }]
                        }
                    }]
                }
            }, {
                "id": "AI_BTool_BToolBuilds_ContinuousBuildWithNexusI",
                "projectName": "A I / B Tool / VAR Builds",
                "steps": {
                    "step": [ {
                        "id": "RUNNER_22791",
                        "name": "Build",
                        "type": "MSBuild",
                        "properties": {
                            "property": [{
                                "name": "msbuild_version",
                                "value": "16.0"
                            }, {
                                "name": "run-platform",
                                "value": "x86"
                            }, {
                                "name": "teamcity.step.mode",
                                "value": "default"
                            }, {
                                "name": "toolsVersion",
                                "value": "15.0"
                            }]
                        }
                    }]
                }
            }]
        }
    }, {
        "id": "AI_BTool_BToolBuilds_VARApiBuilds",
        "buildTypes": {
            "buildType": [{
                "id": "AI_BTool_BToolBuilds_CiVARNewSolutionContinuousBuild",
                "projectName": "A I / B Tool / VAR Builds / VAR API builds",
                "steps": {
                    "step": [ {
                        "id": "RUNNER_22791",
                        "name": "Build",
                        "type": "MSBuild",
                        "properties": {
                            "property": [{
                                "name": "msbuilds_version",
                                "value": "15.0"
                            }, {
                                "name": "toolsVersion",
                                "value": "15.0"
                            }]
                        }
                    }]
                }
            }, {
                "id": "AI_BTool_BToolBuilds_VARApiBuilds_CiVARIngestionWindowsServiceNonReleaseBranchBuild",
                "projectName": "A I / B Tool / VAR Builds / VAR API builds",
                "steps": {
                    "step": [{
                        "id": "RUNNER_22790",
                        "name": "Nuget Installer",
                        "type": "jb.nuget.installer",
                        "properties": {
                            "property": [{
                                "name": "nuget.path",
                                "value": "%teamcity.tool.NuGet.CommandLine.4.9.2%"
                            }, {
                                "name": "msbuilds_version",
                                "value": "16.0"
                            }, {
                                "name": "nuget.use.restore",
                                "value": "restore"
                            }, {
                                "name": "sln.path",
                                "value": "VAR.sln"
                            }, {
                                "name": "teamcity.step.mode",
                                "value": "default"
                            }]
                        }
                    }]
                }
            }]
        }
    }]
}


我目前的解决方案 我的代码片段到现在为止

import json

with open('UnArchivedBuilds.txt') as api_call:
  read_content = json.load(api_call)

#for project in read_content['project']:
#   print (project.get('buildTypes'))


for project in read_content['project']:
   # print (project['id'])
   print (project['buildTypes']['buildType'])

如果msbuild_版本低于15.0,我无法决定JSON的层次结构以打印相关数据(即id和projectName)


Tags: nameprojectapiidvalueversionvarstep
1条回答
网友
1楼 · 发布于 2024-10-03 19:30:21

我看了一下你的JSON数据,它被破坏了。为了处理您提供的代码段,我修复了格式错误的数据并删除了不需要的部分以减少混乱:

{
    "project": [{
        "buildTypes": {
            "buildType": [{
                "id": "AIntegration_BTool_BToolBuilds_DraftBuild",
                "projectName": "A Integration / B Tool / VAR Builds"
            },
            {
                "id": "AIntegration_BTool_BToolBuilds_ContinuousBuildIntegration",
                "projectName": "A Integration / B Tool / VAR Builds"
            }]
        }
    }]
}

根据我上面的评论,我建议使用递归或使用模式验证器来分解JSON数据。然而,作为一种快速而肮脏的方法,由于数据集的奇怪结构,我决定对数据的某些部分进行多次迭代。对同一数据进行迭代是非常丑陋的,在大多数情况下被认为是不好的做法

假设数据存储在一个名为input.json的文件中,下面的代码段将为您提供所需的输出:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import json

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

projects = (element for element in data.get('project'))
build_types = (element.get('buildTypes') for element in projects)
build_types = (element.get('buildType') for element in build_types)

for item in build_types:
    for element in item:
        identifier = element.get('id')
        project_name = element.get('projectName')
        print('{}  > {}'.format(identifier, project_name))

印刷:

AIntegration_BTool_BToolBuilds_DraftBuild  > A Integration / B Tool / VAR Builds
AIntegration_BTool_BToolBuilds_ContinuousBuildIntegration  > A Integration / B Tool / VAR Builds

相关问题 更多 >