如何在PowerShell中访问Azure Advisor嵌套JSON字段savingsCurrency?
问题分析与解决方案
核心错误
你的代码存在两个关键问题:
- 转换方向完全搞反:你用
ConvertTo-Json把additionalInfo转成了JSON字符串,但字符串本身没有.savingsCurrency属性,导致后续空值检查永远不通过;直接打印时PowerShell会把字符串和.savingsCurrency拼接,出现"对象后追加.savingsCurrency"的异常现象。 - 空值检查逻辑冗余:用
[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
相关产品推荐
相关产品推荐

