PowerShell中如何从嵌套JSON响应提取指定字段值
在PowerShell中提取嵌套JSON里的特定值
你的JSON响应里,customFields数组的元素并不是标准JSON对象,而是PowerShell哈希表格式的字符串(比如@{id=60; caption=M&S Agreement Status; ...}),所以直接用ConvertFrom-Json后,这些元素依然是字符串,无法直接访问内部的value属性。
方法1:使用Invoke-Expression转换字符串为对象(简单但需注意安全)
这种方法直接执行字符串形式的哈希表代码,快速转换为PowerShell对象:
# 转换原始JSON为PowerShell对象 $jsonObject = $agreementsResponse | ConvertFrom-Json # 提取目标值 $targetValue = $jsonObject.value | ForEach-Object { # 遍历每个customField字符串,转换为对象后筛选 $_.customFields | ForEach-Object { $field = Invoke-Expression $_ # 匹配value为GoAnywhere的项,返回其value if ($field.value -eq 'GoAnywhere') { $field.value } } } # 输出结果 $targetValue
方法2:手动解析字符串(更安全,避免执行未知代码)
如果担心Invoke-Expression的安全风险(比如字符串包含恶意代码),可以手动拆分键值对构建对象:
$jsonObject = $agreementsResponse | ConvertFrom-Json $targetValue = $jsonObject.value | ForEach-Object { $_.customFields | ForEach-Object { # 去除字符串首尾的@{和},拆分键值对 $cleanedStr = $_ -replace '^@\{|\}$', '' $kvPairs = $cleanedStr -split ';' | ForEach-Object { $_.Trim() } # 构建自定义对象 $fieldObj = [PSCustomObject]@{} foreach ($kv in $kvPairs) { if ($kv -match '^(\w+)\s*=\s*(.*)$') { $fieldObj | Add-Member -NotePropertyName $matches[1] -NotePropertyValue $matches[2] } } # 筛选并返回目标值 if ($fieldObj.value -eq 'GoAnywhere') { $fieldObj.value } } } $targetValue
关键说明
- 两种方法的核心都是把
customFields里的字符串转换为可访问的PowerShell对象,之后才能提取内部的value属性。 - 如果需要根据
caption(比如"Product Type")筛选,只需把判断条件改成$field.caption -eq 'Product Type'即可。
内容的提问来源于stack exchange,提问作者Chris Payne
相关产品推荐
相关产品推荐

