无法获取ConvertFrom-Json创建对象的键:缺失GetEnumerator()与keys
解决ConvertFrom-Json生成对象缺少GetEnumerator()和keys属性的问题
你遇到的问题很典型:ConvertFrom-Json返回的是PSCustomObject类型的对象,而不是像你定义的$myobj那样的哈希表(IDictionary类型),所以它没有原生的GetEnumerator()方法和keys属性,导致你没法像操作哈希表那样去遍历键值对。
先看一下问题的重现代码(和你提供的一致):
$string = '{ "OBJECT": "SOP10107", "OBJECTKEY": "2|OSTD-9999 " }' $obj = $string | ConvertFrom-Json $obj # 这里其实会输出对象内容,只是没法用哈希表的方法操作 $obj | % getEnumerator | % { $_.key $_.value } # 报错或无结果,因为方法不存在 $obj.keys # 返回$null,因为属性不存在 # 对比哈希表的正常表现 $myobj = @{ "key1" = "val1"; "key2" = "val2" } $myobj # 正常输出键值对 $myobj | % getEnumerator | % { $_.key $_.value } # 正常遍历 $myobj.keys # 正常返回键列表
下面给你两种解决办法:
方法1:将PSCustomObject转换为哈希表
写一个简单的转换函数,把PSCustomObject转成哈希表,这样就能用你熟悉的哈希表方法了:
function ConvertTo-Hashtable { param( [Parameter(ValueFromPipeline)] [PSCustomObject]$InputObject ) process { $hashtable = @{} # 遍历PSCustomObject的所有属性 $InputObject.PSObject.Properties | ForEach-Object { $hashtable[$_.Name] = $_.Value } return $hashtable } }
使用示例:
$string = '{ "OBJECT": "SOP10107", "OBJECTKEY": "2|OSTD-9999 " }' $obj = $string | ConvertFrom-Json $hashtableObj = $obj | ConvertTo-Hashtable # 现在就能正常操作了 $hashtableObj.keys # 返回OBJECT、OBJECTKEY $hashtableObj | ForEach-Object GetEnumerator | ForEach-Object { Write-Host "键: $($_.Key),值: $($_.Value)" }
方法2:直接遍历PSCustomObject的PSObject.Properties
如果不想转换类型,也可以直接通过PSCustomObject自带的PSObject.Properties属性来遍历所有键值对,这是PowerShell自定义对象的标准属性:
$string = '{ "OBJECT": "SOP10107", "OBJECTKEY": "2|OSTD-9999 " }' $obj = $string | ConvertFrom-Json # 直接遍历属性 $obj.PSObject.Properties | ForEach-Object { Write-Host "键: $($_.Name),值: $($_.Value)" }
简单总结一下:PSCustomObject是PowerShell的自定义对象,它的属性存储在PSObject.Properties里,而哈希表是字典类型,自带集合操作方法。根据你的需求选择上面的方法就可以解决问题啦。
内容的提问来源于stack exchange,提问作者Chris76786777
相关产品推荐
相关产品推荐

