当使用PowerShell不知道结构时,如何通过HTTP JSON响应进行迭代



当确切的结构未知时,我正试图遍历一些JSON。

此JSON如下所示:

"object" : { 
"Item1" : { 
"property1" : "a"
"property2" : "b"
}
}
"Item2" : { 
"property1" : "c"
"property2" : "d"
}
}
}

问题是,我不知道Item1或Item2的实际名称是什么。它是一个由字母数字字符组成的字符串,每次调用都不同。

我试过

$json_response = $response.object
foreach($item in $json_response) { 
$id = $item.property1
Write-Host $id
}

然而,$id值从未设置为proprty1的值。写入主机总是打印出一个空字符串。

如果我只是做一个

Write-Host $json_response

我得到了类似的东西

@{Item1=; item2=}

我认为这可能是一个哈希表,可以让我使用键对其进行迭代,但没有keys属性。

有人能帮忙吗?

更新:Lee_Daley的回复让我更进一步,但仍然无法访问这些属性。在Lee_Dailey的帮助下,我想出了以下方法:

foreach ($item in $response_json.PSobject.Properties) { 
$json2 = $item | ConvertTo-Json
Write-Host $json2
}

这将创建以下JSON

{
"Value":  {
"property1":  "a",
"property2":  "b"
}
}

但是,我仍然无法访问属性1。进行

$id = json2.Value.property1 
Write-Host $id

结果为空值。如何访问$json2变量中JSON中的属性?

更新2。我想我做到了,但我不知道这是正确的还是黑客。将上面的代码更新为

$json2 = $item | ConvertTo-Json | ConvertFrom-Json 

似乎允许我做

$id = $json2.Value.property1

我不确定"价值"是从哪里来的。它不是HTTP响应的一部分。转换为JSON然后再将其转换回来似乎也很奇怪,但这似乎暴露了属性。

我猜json应该是这样的。这些结构不好的对象很常见。您可以使用.pobjects.properties或get成员循环遍历"对象"的属性。此外,在较新版本的powershell中,您可以将json转换为hashtable并使用keys属性。

{
"object": {
"Item1": {
"property1": "a",
"property2": "b"
}
},
"Item2": {
"property1": "c",
"property2": "d"
}
}

另请参阅:通过JSON文件进行迭代PowerShell

在一个理想的世界里,它会是这样的。但结果更为冗长。

{
"object": [
{
"name": "Item1",
"value": [
{
"name": "property1",
"value": "a"
},
{
"name": "property2",
"value": "b"
}
]
},
{
"name": "Item2",
"value": [
{
"name": "property1",
"value": "c"
},
{
"name": "property2",
"value": "d"
}
]
}
]
}
$a = cat file.json | convertfrom-json

$a.object
name  value
----  -----
Item1 {@{name=property1; value=a}, @{name=property2; value=b}}
Item2 {@{name=property1; value=c}, @{name=property2; value=d}}

$a.object.value                      
name      value
----      -----
property1 a
property2 b
property1 c
property2 d

最新更新