PowerShell Core中Newtonsoft.Json.Net的异常行为排查
问题原因与解决方案
核心原因
PowerShell的函数返回机制会自动枚举所有实现IEnumerable接口的对象,而Newtonsoft.Json.Linq.JObject恰好实现了IEnumerable<JToken>接口。当你从函数返回JObject时,PowerShell会自动拆解它的所有子JToken并返回集合,而非完整的JObject实例。
你看似拿到的是JObject,实际是PowerShell重新包装后的JToken集合(或单个JToken):
- 用索引访问时,本质是在操作集合而非JObject,所以返回空值
- 调用
ToString()时,PowerShell会隐式将集合拼接为完整JSON字符串,因此显示正常 - 直接在命令行执行代码时,没有经过函数返回的枚举处理,拿到的是原始完整的JObject实例,所以访问正常
修复方案
只需阻止PowerShell对JObject的自动枚举,有两种常用方式:
方式1:使用Write-Output -NoEnumerate返回
function ConvertTo-NSJson { param($InputObject) $jsonStr = $InputObject | ConvertTo-Json -Depth 100 $jObject = [Newtonsoft.Json.Linq.JObject]::Parse($jsonStr) Write-Output -NoEnumerate $jObject }
方式2:用逗号运算符包装为单元素数组
function ConvertTo-NSJson { param($InputObject) $jsonStr = $InputObject | ConvertTo-Json -Depth 100 $jObject = [Newtonsoft.Json.Linq.JObject]::Parse($jsonStr) return ,$jObject }
验证
调用修复后的函数,返回的将是完整的JObject实例,此时可以正常通过索引(如$result["YourProperty"])或Item方法访问属性值。
内容的提问来源于stack exchange,提问作者Alain
相关产品推荐
相关产品推荐

