使用Powershell读取JSON层次结构子节点数可以是任何数字文件

如何解决使用Powershell读取JSON层次结构子节点数可以是任何数字文件

使用Powershell读取JSON层次结构(子节点数可以是任何数字)文件。 我可以为一个级别执行此操作,但对于N个循环和嵌套循环也需要相同的操作 需要在树状视图中显示结果,如果不可能的话,则以表格的方式将标题放在根表的顶部

下面是到目前为止我开发的脚本:

$Filepath = 'C:\Users\Learner\Test2.JSON'
$JsonContent=gc $Filepath | ConvertFrom-Json
$RootNodeCount=$JsonContent.psobject.Properties.name.Count
$RootNodeName=$JsonContent.psobject.Properties.name
foreach ($Name in $RootNodeName) {Echo $Name-->  $JsonContent.$Name} 

JSON文件

{
    "foundation": {
        "network": {
            "resource_group_name": "rg-network-e2","name": "nonprodvnet-e2"
        },"diagnostics": {
            "resource_group_name": "rg-mgmt-cu","storage_account_name": "Sreacnt-e2"
        },"log_analytics": {
            "resource_group_name": "rg-mgmt-cu","workspace_name": "la-sap-e2"
        },"recovery_vault": {
            "resource_group_name": "rg-mgmt-cu","name": "rsv-sap-e2"
        },"windows_domain": {
            "domain_name": "dmn.local","ou_path": "CN=Computers,DC=example,DC=com","domain_user": "svc_domainjoin@dmn.local","domain_password": "Pwd01"
        }
    },"control_flags": {
        "enable_boot_diagnostics": true,"enable_oms": false,"enable_backup": true,"windows_domain_join": false
    },"deployment": {
        "resource_group": {
            "name": "rg-sap-501-e2","location": "eastus2"
        },"tags": {
            "owner": "for SAP"
        },"os_account": {
            "admin_username": "locadm"
        },"proximity_placement_groups": {
            "ppg-501": {}
        },"availability_sets": {
            "avset-cs-501": {
                "ppg_name": "ppg-501"
            },"avset-app-501": {
                "ppg_name": "ppg-501"
            },"avset-db-501": {
                "ppg_name": "ppg-501"
            }
        },"load_balancers": {
            "ilb-sap-501": {
                "dv2ascs": {
                    "ip_address": "192.0.18.20","probe_port": 62000,"subnet": "app"
                },"dv2-ers": {
                    "ip_address": "192.0.18.21","probe_port": 62102,"subnet": "app"
                }
            },"ilb-db-501": {
                "dv2-hana": {
                    "ip_address": "192.0.17.12","probe_port": 62503,"subnet": "db"
                }
            }
        },"server_groups": {
            "ascs": {
                "os_type": "linux","sku": "Standard_E4s_v3","availability_set": "avset-cs-501","backup_policy": "sap","ppg_name": "ppg-501","lb_refs": [
                    "dv2-ascs","dv2-ers"
                ],"os_disk_size": "30","enable_accelerated_networking": true,"hosts": {
                    "vcs501-01": {
                        "nics": [
                            [
                                "192.0.18.18"
                            ]
                        ]
                    },"vcs501-02": {
                        "nics": [
                            [
                                "192.0.18.19"
                            ]
                        ]
                    }
                },"subnet": "app","image_details": {
                    "resource_id": null,"marketplace_reference": {
                        "publisher" : "SUSE","offer"     : "sles-sap-15-sp1","sku"       : "gen1","version": "latest"
                    }
                },"disks": [
                    {
                        "name": "usrsap","disk_size": "128","number_of_disks": 1
                    }
                ]
            },"apps": {
                "type": "app_linux","os_type": "linux","availability_set": "avset-app-501","hosts": {
                    "vas501-01": {
                        "nics": [
                            [
                                "192.0.18.16","192.0.18.26"
                            ]
                        ]
                    },"vas501-02": {
                        "nics": [
                            [
                                "192.0.18.17","192.0.18.27"
                            ]
                        ]
                    }
                },"offer"     : "sles-15-sp1","hana": {
                "os_type": "linux","sku": "Standard_E32s_v3","availability_set": "avset-db-501","subnet": "db","lb_refs": [
                    "dv2-hana"
                ],"hosts": {
                    "vhs501-01": {
                        "nics": [
                            [
                                "192.0.17.10"
                            ]
                        ]
                    },"vhs501-02": {
                        "nics": [
                            [
                                "192.0.17.11"
                            ]
                        ]
                    }
                },"number_of_disks": 1
                    },{
                        "name": "hanashared",{
                        "name": "hanadata","number_of_disks": 3
                    },{
                        "name": "hanalog","number_of_disks": 2
                    },{
                        "name": "hanabackup","disk_size": "512","number_of_disks": 1
                    }
                ]
            }
        }
    }
}

解决方法

您实际上不是在读取Json文件,而是实际上是一个PowerShell对象的层次结构,该对象可能包含许多(.Net)对象类型,但是在这种情况下,它受原始Json结构的限制,该结构仅包含三种主要类型中的一种:

要通读未知深度的层次结构的最佳方法是使用recursive函数,这是一个调用自身的函数。给您一个具体问题的例子:

Function Show-Object ($Object,$Depth = 0,$Name) {
    $Indent = if ($Depth++) { "    " * ($Depth - 2) }
    if ($Object -is [Array]) {
        If ($Name) { "$Indent$Name =" }
        foreach ($Item in $Object) {
            Show-Object $Item $Depth
        }
    }
    elseif ($Object -is [PSCustomObject]) {
        If ($Name) { "$Indent$Name =" }
        foreach ($Name in $Object.PSObject.Properties.Name) {
            Show-Object $Object.$Name $Depth $Name
        }
    }
    else {
        if ($Name) { "$Indent$Name = $Object" } else { "$Indent$Object" }
    }
}

如您所见,在结构可能存在任何子对象的情况下(对于[Array][PSCustomObject]而言,Show-Object函数使用子对象作为自身来调用自身)新的输入对象,以及一些其他参数,例如跟踪当前的$Depth

您可以像下面这样简单地调用函数:

Show-Object $JsonContent

或将其导出到以下文件中:

Show-Object $JsonContent | Out-File .\text1.txt

对于您的$JsonContent,它将导致:

foundation =
    network =
        resource_group_name = rg-network-e2
        name = nonprodvnet-e2
    diagnostics =
        resource_group_name = rg-mgmt-cu
        storage_account_name = Sreacnt-e2
    log_analytics =
        resource_group_name = rg-mgmt-cu
        workspace_name = la-sap-e2
    recovery_vault =
        resource_group_name = rg-mgmt-cu
        name = rsv-sap-e2
    windows_domain =
        domain_name = dmn.local
        ou_path = CN=Computers,DC=example,DC=com
        domain_user = svc_domainjoin@dmn.local
        domain_password = Pwd01
control_flags =
    enable_boot_diagnostics = True
    enable_oms = False
    enable_backup = True
    windows_domain_join = False
deployment =
    resource_group =
        name = rg-sap-501-e2
        location = eastus2
    tags =
        owner = for SAP
    os_account =
        admin_username = locadm
    proximity_placement_groups =
        ppg-501 =
    availability_sets =
        avset-cs-501 =
            ppg_name = ppg-501
        avset-app-501 =
            ppg_name = ppg-501
        avset-db-501 =
            ppg_name = ppg-501
    load_balancers =
        ilb-sap-501 =
            dv2ascs =
                ip_address = 192.0.18.20
                probe_port = 62000
                subnet = app
            dv2-ers =
                ip_address = 192.0.18.21
                probe_port = 62102
                subnet = app
        ilb-db-501 =
            dv2-hana =
                ip_address = 192.0.17.12
                probe_port = 62503
                subnet = db
    server_groups =
        ascs =
            os_type = linux
            sku = Standard_E4s_v3
            availability_set = avset-cs-501
            backup_policy = sap
            ppg_name = ppg-501
            lb_refs =
                dv2-ascs
                dv2-ers
            os_disk_size = 30
            enable_accelerated_networking = True
            hosts =
                vcs501-01 =
                    nics =
                            192.0.18.18
                vcs501-02 =
                    nics =
                            192.0.18.19
            subnet = app
            image_details =
                resource_id =
                marketplace_reference =
                    publisher = SUSE
                    offer = sles-sap-15-sp1
                    sku = gen1
                    version = latest
            disks =
                    name = usrsap
                    disk_size = 128
                    number_of_disks = 1
        apps =
            type = app_linux
            os_type = linux
            sku = Standard_E4s_v3
            availability_set = avset-app-501
            backup_policy = sap
            ppg_name = ppg-501
            enable_accelerated_networking = True
            os_disk_size = 30
            hosts =
                vas501-01 =
                    nics =
                            192.0.18.16
                            192.0.18.26
                vas501-02 =
                    nics =
                            192.0.18.17
                            192.0.18.27
            subnet = app
            image_details =
                resource_id =
                marketplace_reference =
                    publisher = SUSE
                    offer = sles-15-sp1
                    sku = gen1
                    version = latest
            disks =
                    name = usrsap
                    disk_size = 128
                    number_of_disks = 1
        hana =
            os_type = linux
            sku = Standard_E32s_v3
            availability_set = avset-db-501
            backup_policy = sap
            ppg_name = ppg-501
            os_disk_size = 30
            subnet = db
            lb_refs =
                dv2-hana
            hosts =
                vhs501-01 =
                    nics =
                            192.0.17.10
                vhs501-02 =
                    nics =
                            192.0.17.11
            image_details =
                resource_id =
                marketplace_reference =
                    publisher = SUSE
                    offer = sles-sap-15-sp1
                    sku = gen1
                    version = latest
            disks =
                    name = usrsap
                    disk_size = 128
                    number_of_disks = 1
                    name = hanashared
                    disk_size = 128
                    number_of_disks = 1
                    name = hanadata
                    disk_size = 128
                    number_of_disks = 3
                    name = hanalog
                    disk_size = 128
                    number_of_disks = 2
                    name = hanabackup
                    disk_size = 512
                    number_of_disks = 1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-