簡體   English   中英

使用 Python 遍歷嵌套的 JSON 數據

[英]Use Python to iterate through nested JSON data

任務:我正在使用 API 調用從我們的 TeamCity CI 工具獲取 JSON 數據。 我們需要識別所有使用舊版本 msbuild 的構建。 我們可以從這個 API 調用數據中識別{ "name": "msbuild_version", "value": "15.0" }目前我正在將整個 API 調用數據保存到一個文件中; 但是我稍后會將 API 調用集成到同一個腳本中。 現在到手頭的問題; 我如何過濾上面的屬性,即 msbuild_version,說 msbuild_version < 15.0(即所有 msbuild 低於版本 15.0)並在“buildType”下顯示相應的“id”和“projectName”; 例如

"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'])

我無法決定 JSON 的層次結構以在 msbuild_version 小於 15.0 的任何地方打印相關數據(即 id 和 projectName)

我查看了您損壞的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM