使用Powershell从JSON获取值
非常初级的问题。我正在尝试使用Powershell从JSON获取某些值。。具体来说,我只想列出服务:TEST00000和FAKE 当我运行下面的脚本时,我得到以下结果:使用Powershell从JSON获取值,json,powershell,Json,Powershell,非常初级的问题。我正在尝试使用Powershell从JSON获取某些值。。具体来说,我只想列出服务:TEST00000和FAKE 当我运行下面的脚本时,我得到以下结果: TEST00000 FAKE --------- ---- @{Enabled=T
TEST00000 FAKE
--------- ----
@{Enabled=True; Processed=2; Sent=3; Failed=4; Downloaded=5} @{Enabled=True}
我怎样才能得到一份服务清单
更重要的是,如何仅列出其中启用了key/value=True的服务
代码如下:
$JSON = '{
"Envs": {
"DEV": {
"Services": {
"TEST00000": {
"Enabled": true,
"Processed": 2,
"Sent": 3,
"Failed": 4,
"Downloaded": 5
},
"FAKE": {
"Enabled": true
}
}
}
},
"Component": {
"Digger": {
"Envs": {
"DEV": {
"DownloadE": 4
}
}
}
}
}'
$jsonobj = ConvertFrom-Json -inputObject $JSON
$jsonobj.Envs.DEV.Services
这应该允许您动态获取名称,而不考虑JSON中的服务名称:
$JSON = '{
"Envs": {
"DEV": {
"Services": {
"TEST00000": {
"Enabled": true,
"Processed": 2,
"Sent": 3,
"Failed": 4,
"Downloaded": 5
},
"FAKE": {
"Enabled": true
}
}
}
},
"Component": {
"Digger": {
"Envs": {
"DEV": {
"DownloadE": 4
}
}
}
}
}'
$jsonobj = ConvertFrom-Json -inputObject $JSON
$enabledServices = $NULL
$disabledServices = $NULL
# Since the service names are arbitrary
# create an object that contains only
# objects whose MemberType is NoteProperty
$strServiceNames = @($($jsonobj.Envs.DEV.Services | Get-Member | Where { $_.MemberType -eq "NoteProperty" } | Select Name).Name)
$pscoServiceNames = [PSCustomObject]@{Names=$strServiceNames}
foreach($serviceName in $pscoserviceNames.Names)
{
# dynamically access the service name
# from $jsonobj.Envs.DEV.Services
$serviceStatus = $jsonobj.Envs.DEV.Services.$serviceName.Enabled
# parse results based on value of .Enabled
if($serviceStatus.ToString() -eq "True")
{
$enabledServices = [Array]$enabledServices + [PSCustomObject]@{Name = $serviceName;Enabled = $serviceStatus}
}
else
{
$disabledServices = [Array]$disabledServices + [PSCustomObject]@{Name = $serviceName;Enabled = $serviceStatus}
}
}
# Show the results
Write-Output "`nEnabled Services`n"
$enabledServices | Format-List
Write-Output "`nDisabled Services`n"
$disabledServices | Format-List
如果有任何不清楚的地方,请告诉我,我可以更详细地解释
希望这对你有所帮助。
炮击快乐 获取每个
服务
属性的名称。您可以像user2734259那样使用Get Member
,也可以使用psobject
属性来存储有关对象的有用信息
$ServiceNames = $jsonobj.Envs.DEV.Services.psobject.properties.name
一旦您有了这些名称,您就可以在其上循环并在子属性上进行过滤
$jsonobj.Envs.DEV.Services.psobject.properties.name | ForEach-Object {
$_ | Where-Object {$jsonobj.Envs.DEV.Services.$_.Enabled -eq $True}
}
非常感谢您的回复,这非常有趣!如果($serviceStatus-eq“False”)@toastman,我将在回到编写代码的机器时再次访问,并在必要时进行修复和编辑,以确保完整性。认为这可能是一个类型问题,但会检查。在那之前,祝你假期愉快,这是一个类型错误$serviceStatus是布尔值,因此需要将其转换为字符串以匹配正则表达式。所以只要将这一行更改为:if($serviceStatus.ToString()-eq“False”)
,它就可以根据需要工作了。最后,我使用了BenH的代码,将BenH response标记为解决方案。但我非常感谢你们的帮助。非常感谢你们的回复,这非常有趣,我花了很多时间试图寻找这些信息,你们是怎么知道的?我在哪里可以进一步阅读这篇文章?(还是在学习使用PS帮助内容的艺术!?)@ToastMan我个人从唐琼斯午餐月书籍开始。知道隐藏的psobject
属性后,我从某人的答案中找到了它(太长时间不记得是谁了)。嗯,最后一部分似乎不起作用:$| Where Object{$jsonobj.Envs.DEV.Services.$|Enabled-eq'false'}@ToastMan更新了我的答案以解决这个问题。这是因为Enabled
属性是布尔值。当您尝试将字符串'false'
转换为布尔值时,它会变成$True
。您可以使用[bool]'false'
来测试这一点。