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

如何在PowerShell中访问Azure Advisor嵌套JSON字段savingsCurrency?

问题分析与解决方案

核心错误

你的代码存在两个关键问题:

  1. 转换方向完全搞反:你用ConvertTo-Json把additionalInfo转成了JSON字符串,但字符串本身没有.savingsCurrency属性,导致后续空值检查永远不通过;直接打印时PowerShell会把字符串和.savingsCurrency拼接,出现"对象后追加.savingsCurrency"的异常现象。
  2. 空值检查逻辑冗余:用[string]::IsNullOrEmpty()检查对象属性不符合PowerShell的使用习惯,容易出现误判。

修正思路

Azure Advisor返回的additionalInfo通常是JSON格式的字符串,需要用ConvertFrom-Json解析成PowerShell可操作的对象后,才能直接访问嵌套属性。如果additionalInfo已经是解析好的PS对象,则无需转换,直接访问即可。

修正后的代码

通用兼容版(适配字符串/对象两种情况)

Write-Output "advisorrecommendation: $advisorRecommendation"

# 检查additionalInfo是否存在且非空
if ($advisorRecommendation.additionalInfo -and $advisorRecommendation.additionalInfo -ne '') {
    # 尝试解析为对象(如果是JSON字符串)
    try {
        $additionalInfoObj = $advisorRecommendation.additionalInfo | ConvertFrom-Json -ErrorAction Stop
    } catch {
        # 若已是对象,直接赋值
        $additionalInfoObj = $advisorRecommendation.additionalInfo
    }

    # 打印完整的additionalInfo结构(避免嵌套截断)
    Write-Output "additionalInfo: $($additionalInfoObj | ConvertTo-Json -Depth 10)"
    
    # 检查并获取savingsCurrency
    if ($additionalInfoObj.savingsCurrency) {
        Write-Output "Currency: $($additionalInfoObj.savingsCurrency)"
    }
} else {
    $additionalInfoObj = $null
}

简化版(已知additionalInfo是JSON字符串)

如果能确认additionalInfo是JSON字符串,直接使用以下代码即可:

Write-Output "advisorrecommendation: $advisorRecommendation"

if ($advisorRecommendation.additionalInfo -and $advisorRecommendation.additionalInfo -ne '') {
    $additionalInfoObj = $advisorRecommendation.additionalInfo | ConvertFrom-Json
    Write-Output "additionalInfo: $($additionalInfoObj | ConvertTo-Json -Depth 10)"
    
    if ($additionalInfoObj.savingsCurrency) {
        Write-Output "Currency: $($additionalInfoObj.savingsCurrency)"
    }
} else {
    $additionalInfoObj = $null
}

关键说明

  • ConvertFrom-Json:这才是你需要的转换工具——将JSON字符串转换为PowerShell可操作的对象,而非反向转成字符串。
  • $($additionalInfoObj | ConvertTo-Json -Depth 10):用子表达式打印完整的JSON结构,-Depth 10避免嵌套层级过深导致内容截断。
  • 直接用$additionalInfoObj.savingsCurrency做判断:PowerShell会自动处理空值、null、空字符串的情况,比[string]::IsNullOrEmpty()更简洁可靠。

内容的提问来源于stack exchange,提问作者Stijn Berendse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:33:16