PowerShell中如何直接通过键名访问JSON嵌套值与数组元素
PowerShell 简洁访问JSON键值实现方案
PowerShell 原生支持极简的JSON属性访问语法,完全不需要循环遍历、手动操作PsObject.Properties,写法简洁度和Python基本一致。
第一步:解析webhook传入的JSON字符串
Azure 自动化Runbook被webhook触发时,请求内容会存放在内置参数$WebhookData中,首先用内置命令把JSON字符串转为PowerShell可直接访问的对象:
<# webhook传入的RequestBody是原始字符串格式,必须先做转换 如果使用PowerShell 5.1运行时,建议追加 -Depth 10 参数,避免深层嵌套属性解析不全 PowerShell 7.2+运行时无此问题,也是Azure Runbook目前推荐的运行时版本 #> $json = $WebhookData.RequestBody | ConvertFrom-Json
第二步:按路径取值(完全等效Python逻辑)
你给出的Python示例代码,可直接对应为以下PowerShell写法,嵌套属性用点号分隔、数组索引用方括号,索引规则和Python一致从0开始计数:
# 对应 Python: substance = json["data"]["inventory_item"]["name"] $substance = $json.data.inventory_item.name # 对应 Python: vendor = json["data"]["inventory_item"]["vendor"] $vendor = $json.data.inventory_item.vendor # 对应 Python: sid = json["data"]["subids"][1] # 注意:你提供的JSON结构中subids是inventory_item的子节点,不是data的直接子节点,路径不要写错 $sid = $json.data.inventory_item.subids[1] # 其余嵌套属性都按「对象.一级键.二级键.数组[索引]」的格式写即可 $labName = $json.data.inventory_item.lab.name $addUserEmail = $json.data.inventory_item.added_by.email
特殊场景写法
只有遇到键名包含空格、特殊字符,或者键名是动态变量的场景,才需要用引号包裹键名:
# 键名带空格/特殊字符 $specialVal = $json.data.inventory_item.'key with space' # 动态键名(键名存在变量里) $targetProp = "catalog_number" $catalogNum = $json.data.inventory_item.$targetProp
实用避坑提示
- 如果不确定某层节点是否存在,可以用空条件运算符
?避免脚本报错,写法为$json.data.inventory_item?.name,中间任意层级缺失时会直接返回$null,不会终止脚本运行 - PowerShell默认的JSON解析不会自动做类型转换,字符串、数字、数组类型会和原始JSON保持一致,不需要额外做类型处理
- 不要用网上搜到的遍历属性、递归查找的写法,那些是处理未知结构JSON的方案,你这种结构固定的场景直接用点号访问性能最高、写法最简洁
内容的提问来源于stack exchange,提问作者vQuiche
相关产品推荐
相关产品推荐

