如何在PowerShell中将JSON哈希表读取为实际哈希表?
问题描述
有如下JSON文件foo.json:
{ "foo": { "a": 1, "b": 2 } }
使用PowerShell命令读取后,仅能通过点语法访问属性,使用哈希表索引语法会报错:
$foo = Get-Content 'foo.json' | ConvertFrom-Json -Depth 30 $foo.a # 输出 1 $foo.b # 输出 2 $foo['a'] # 触发错误
需要实现将读取的JSON对象转为实际哈希表,或通过合理硬编码方式实现索引访问。
解决方案
方法1:将JSON转为哈希表
通过自定义函数把ConvertFrom-Json生成的PSObject递归转为哈希表,支持嵌套结构:
function ConvertTo-Hashtable { param( [Parameter(ValueFromPipeline)] $InputObject ) process { if ($InputObject -is [PSObject]) { $hash = @{} foreach ($prop in $InputObject.PSObject.Properties) { $hash[$prop.Name] = $prop.Value | ConvertTo-Hashtable } $hash } elseif ($InputObject -is [array]) { $InputObject | ForEach-Object { $_ | ConvertTo-Hashtable } } else { $InputObject } } } # 使用示例 $foo = Get-Content 'foo.json' | ConvertFrom-Json -Depth 30 | ConvertTo-Hashtable $foo['foo']['a'] # 输出 1 $foo.foo.b # 同时兼容点语法访问
方法2:硬编码实现索引访问
无需转换哈希表,直接通过PSObject.Properties实现索引式属性访问:
# 直接访问的写法 $foo = Get-Content 'foo.json' | ConvertFrom-Json -Depth 30 $foo.foo.PSObject.Properties['a'].Value # 输出 1 # 封装成函数简化调用 function Get-JsonProperty { param( [Parameter(Mandatory)] $JsonObject, [Parameter(Mandatory)] [string]$PropertyName ) $JsonObject.PSObject.Properties[$PropertyName].Value } Get-JsonProperty -JsonObject $foo.foo -PropertyName 'a' # 输出 1
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

