You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:22:40