如何迭代未知的 JSON 数据/对象?

2024-01-28

给出两个 JSON 示例

{
    "A": {
        "name": "noname",
        "key": "nokey"
    }

进而

{
    "B": {
        "property1": "value3",
        "country": "australia"
    }
}

是否可以创建一个 Powershell 脚本,该脚本可以采用任一 JSON 示例并循环遍历它们,而无需预先知道任何名称/键? (使用Windows 2016)

与此处发布的答案类似的内容如何循环或枚举 JavaScript 对象? https://stackoverflow.com/questions/684672/how-do-i-loop-through-or-enumerate-a-javascript-object

var p = {
"p1": "value1",
"p2": "value2",
"p3": "value3"
};

for (var key in p) {
  if (p.hasOwnProperty(key)) {
    console.log(key + " -> " + p[key]);
  }
}

不工作

试过这个,但它只适用于第一级

$json = @"
 {"A": {"property1": "value1", "property2": "value2"}, "B": {"property1": 
 "value3", "property2": "value4"}}
"@

$parsed = $json | ConvertFrom-Json

$parsed.PSObject.Properties | ForEach-Object {
    $next = $_
    $name = $_.Name 
    $value = $_.value
    echo "$name = $value"

    $next.PSObject.Properties | ForEach-Object {
        $name = $_.Name 
        $value = $_.value
        echo "Second level: $name = $value"
    } 
}

ConvertFrom-Json使用嵌套结构PSCustomObjects来表示数据 - 您可以使用$x.psobject.properties获取结构中每个项目的 json 属性名称和值的集合,然后您可以根据需要循环遍历它们。

例如:

$x = ConvertFrom-Json "{ 'A': {'name': 'noname', 'key': 'nokey'} }"

foreach( $rootProperty in @($x.psobject.properties | where-object {$_.MemberType -eq "NoteProperty"}) )
{

    write-host "'$($rootProperty.Name)' = '$($rootProperty.Value)'"

    foreach( $childProperty in @($rootProperty.Value.psobject.properties | where-object {$_.MemberType -eq "NoteProperty"}) )
    {
        write-host "'$($childProperty.Name)' = '$($childProperty.Value)'"
    }

}

输出以下内容:

'A' = '@{name=noname; key=nokey}'
'name' = 'noname'
'key' = 'nokey'

如果将上述内容转换为在嵌套 PSCustomObjects 上调用自身的函数,您也可以递归地将结构遍历到任意深度,但我不确定您是否需要能够这样做,或者只是像您的示例中那样进入 2 层json 文档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何迭代未知的 JSON 数据/对象? 的相关文章

随机推荐