当确切的结构未知时,我正试图遍历一些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