繁体   English   中英

使用选择对象从JSON提取嵌套字段

[英]Extract nested fields from JSON using Select-Object

我有一个使用ConvertFrom-Json转换的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(在meta标签内)。 我该如何实现?

我尝试了下面的方法,但是没有用。

$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 } } @{ name: "new propery name"; expression: { script block } }表示法,可以缩写为@{ n: "propery name"; e: { script block } } @{ n: "propery name"; e: { script block } }

您可以自由地将此表单与实际存在的属性混合使用,这样可以正常工作:

$jsonstring.rows | select name, @{n: "AgentVersion"; e: { $_.meta.agent_version } }

$_引用上下文对象,就像在Foreach_Object cmdlet中一样。

请注意,像$_.meta.agent_version这样的“点表示法”通常会选择与该路径匹配的所有值,这意味着如果有多个值匹配,它可以返回一个数组。 在这种特定情况下,这不是问题,但是在嵌套对象上使用点符号时,很容易被忽略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM