如何遍历未知的JSON数据/对象



给出两个JSON示例

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

然后

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

是否可以创建一个Powershell脚本,该脚本可以采用任意一个JSON示例并在不预先知道任何名称/键的情况下循环使用它们?(使用Windows 2016(

类似于这里发布的答案。我如何循环或枚举JavaScript对象?

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上调用自己的函数,您也可以递归地将结构遍历到任意深度,但我不确定您是否需要能够做到这一点,或者像示例json文档中那样只执行两个级别。

最新更新