使用 ps 深入到最低的 json 元素

问题描述 投票:0回答:1

我需要使用 ps 从 json 文件中提取一些信息。 json 具有嵌套的

components
数组,也可以包含
components
数组。

{
"name": "app",
"components": [
    {
        "component_name": "comp1",
        "component_packages": [
            "comp1_package1",
            "comp1_package2"
        ],
        "project_id": "1234",
        "file_path": "requirements_file",
        "ref": "%%VERSION%%",
        "components": [
            {
                "component_name": "comp1.1",
                "component_packages": [
                    "comp1.1_package1"
                ],
                "project_id": "2345",
                "file_path": "requirements_file",
                "ref": "%%VERSION%%",
                "components": [
                    {
                        "component_name": "comp1.1.1",
                        "component_packages": [
                            "comp1.1.1_package1"
                        ],
                        "project_id": "3456",
                        "file_path": "requirements_file",
                        "ref": "%%VERSION%%",
                        "components": []
                    }]
            },
            {
                "component_name": "comp1.2",
                "component_packages": [
                    "comp1.2_package1"
                ],
                "project_id": "4567",
                "file_path": "requirements_file",
                "ref": "%%VERSION%%",
                "components": []
            }
        ]
    },
    {
        "component_name": "comp2",
        "component_packages": [
            "comp2_package1",
            "comp2_package2"
        ],
        "project_id": "5678",
        "file_path": "requirements_file",
        "ref": "%%VERSION%%",
        "components": [
            {
                "component_name": "comp2.1",
                "component_packages": [
                    "comp2.1_package1"
                ],
                "project_id": "6789",
                "file_path": "requirements_file",
                "ref": "%%VERSION%%",
                "components": []
            }
        ]
    }
]   

}

对于

component
内的每个
components
,我需要执行一个脚本来收集更多信息,但我很难对所有元素一一进行迭代

我开始将json转换为psobject(

Get-Content -Raw "$json_path" | ConvertFrom-Json
)

我不想修复 json 的深度。所以脚本应该具有适应性。

我尝试使用

while
循环

$comp = $object.components
while ( $comp -ne "" ) { 
   $comp | ForEach-Object {
       # to something
   }
}

但是这样不合适,因为即使我覆盖

$comp
,脚本也会忘记一些条目。

json powershell
1个回答
0
投票

只需使用一个函数并递归调用它

(注意:这可能不是最有效的方法)

$JsonObj = $Json | ConvertFrom-Json


function Drill-Json {
    [CmdletBinding()]
    param (
        [Parameter(
            Mandatory,
            Position = 0,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName,
            ValueFromRemainingArguments
        )]
        [array]$JsonComponent 
    )
        
    
    
    $JsonElement | ForEach-Object {
        <# 

            DO STUFF

        #>
        # $_.component_name
        if (($_.components.count)) {
            Drill-Json -JsonComponent $_.components
        }
    
    }
}

Drill-Json -JsonComponent $JsonObj.components
© www.soinside.com 2019 - 2024. All rights reserved.