json - 使用 Select-Object 从 JSON 中提取嵌套字段
问题描述
我有一个 JSON 文件,我使用它进行了转换ConvertFrom-Json
,我想要从中选择字段。我试图将输出流水线化,Select-Object
但我能够获得名称而不是其他详细信息。
下面是我的输出ConvertFrom-Json
和我的脚本。
display_name : TEL05
name : TEL05
is_muted : False
meta : @{agent_checks=System.Object[]; timezones=System.Object[]; winV=System.Object[]; machine=AMD64; platform=win32;
gohai={"cpu":{"cpu_cores":"12","cpu_logical_processors":"24","family":"6","mhz":"2497","model":"63","model_name":"Intel(R)
Xeon(R) CPU E5-2680 v3 @ 2.50GHz","stepping":"2","vendor_id":"GenuineIntel"},"filesystem":[{"kb_size":"358396","mounted_on":
"","name":"\\\\?\\Volume{00241358-f193-11e7-80b3-806e6f6e6963}\\"},{"kb_size":"104499196","mounted_on":"C:\\","name":"\\\\?\
\Volume{00241359-f193-11e7-80b3-806e6f6e6963}\\"},{"kb_size":"Unknown","mounted_on":"D:\\","name":"\\\\?\\Volume{0024135d-f1
93-11e7-80b3-806e6f6e6963}\\"}],"gohai":{"build_date":"Mon Jun 5 18:30:34 GMT
2017","git_branch":"last-stable","git_hash":"7de20ed","go_version":"go version go1.6.4 windows/amd64"},"memory":{"total":"34
261516288"},"network":{"ipaddress":"10.13.52.15","ipaddressv6":"fe80::dcf6:212:7ce0:8feb%16","macaddress":"44-A8-42-3A-9D-E9
"},"platform":{"GOOARCH":"amd64","GOOS":"windows","goV":"1.6.4","hostname":"TELXCVOIP04","kernel_name":"Windows","kernel_rel
ease":"6.3.9600","machine":"x86_64","os":"Windows Server 2012 R2 Standard","pythonV":"2.7.12"}}; host_id=363974563;
pythonV=2.7.12; processor=Intel64 Family 6 Model 63 Stepping 2, GenuineIntel; agent_version=5.14.0}
host_name : TEL05
has_metrics : True
我想要主机名和 agent_version(在元标记内)。我该如何做到这一点?
我尝试了以下方法,但没有奏效。
$jsonstring = (Get-Content 'servers.JSON') | ConvertFrom-Json
$jsonstring.rows| select name, meta.agent_version
解决方案
您不能使用“点表示法”来索引嵌套散列Select-Object
- 仅支持实际键,并且meta.agent_version
不作为其自己的键存在。
Select-Object
但是,可以为您计算新值,并且遍历嵌套对象是一种计算。为此,您可以使用@{ name="new propery name"; expression={ script block } }
可以缩写为 的符号 @{ n="propery name"; e={ script block } }
。
您可以自由地将这种形式与实际存在的属性混合在一起,这样就可以了:
$jsonstring.rows | select name, @{n="AgentVersion"; e={ $_.meta.agent_version } }
引用上下文对象,$_
就像在Foreach_Object
cmdlet 中一样。
请注意,“点表示法”$_.meta.agent_version
通常会选择与此路径匹配的所有值,这意味着如果多个值匹配,它可以返回一个数组。在这种特殊情况下不是问题,但在嵌套对象上使用点表示法时很容易被忽略。
推荐阅读
- cordova - 有没有办法以编程方式为 IOS Cordova Ionic v1 请求位置许可?
- c# - 如果 Thread 对象在线程例程完成之前消失会发生什么?
- angular - 是否可以缓存 api 响应以使 api 离线可用?
- asp.net - 如何使用 VB 作为 ASPX 运行 SQL Server?
- wso2 - wso2am-analytics 2.2.0 在偏移量 0 上触发
- php - 在 VPS 上托管 laravel 5.6?
- php - 谷歌地图 API。
- r - 使用R中的Grepl查找数据框列中存在的单词列表
- jsp - Tomcat JSP 预编译
- git - 推送提交的 git 分支更改到另一个分支