PowerShell 5.1中判断JSON嵌套键是否存在的问题排查
PowerShell 5.1 读取JSON嵌套键失败的常见问题及修复
常见问题点
未处理嵌套键的路径拆分
多数出错的函数会把A.April这类嵌套键当作一个完整的顶层键去匹配,而没有按.拆分路径、逐层访问JSON结构的各个层级。比如直接检查顶层属性里有没有名为A.April的键,显然不存在,所以报错。键存在性判断逻辑错误
若函数直接用$JsonObj.$KeyPath尝试访问,当路径中某一层级不存在时,PowerShell会返回$null,但函数可能没有逐层校验每个节点的存在性,导致错误地判定整个键不存在,或者返回意外的$null。JSON对象的类型处理错误
PowerShell 5.1中ConvertFrom-Json默认返回PSCustomObject,如果你的函数错误地用哈希表的索引方式(比如$JsonObj[$Key])去访问属性,或者提前把JSON转成了不兼容的类型,也会导致嵌套键无法识别。
修复示例
以下是能正确处理嵌套键的Read-Value函数实现:
function Read-Value { param( [PSCustomObject]$JsonObj, [string]$KeyPath ) $currentNode = $JsonObj # 按点拆分键路径,移除空条目 $keySegments = $KeyPath.Split('.', [System.StringSplitOptions]::RemoveEmptyEntries) foreach ($segment in $keySegments) { # 检查当前层级是否存在该属性 if (-not $currentNode.PSObject.Properties.Name.Contains($segment)) { throw "键路径错误:不存在节点 '$segment'" } # 进入下一层级 $currentNode = $currentNode.$segment # 如果当前节点是值类型而非对象,提前结束遍历 if ($currentNode -isnot [PSCustomObject]) { break } } return $currentNode }
使用示例
假设你的JSON内容如下:
{ "A": { "April": "30", "May": "31" }, "B": "Hello" }
读取嵌套键的调用方式:
# 读取JSON文件并转为PSCustomObject $jsonData = Get-Content -Path "data.json" -Raw | ConvertFrom-Json # 读取A下的April值 Read-Value -JsonObj $jsonData -KeyPath "A.April"
执行后会正确返回30,不会再出现找不到键的错误。
内容的提问来源于stack exchange,提问作者am2
相关产品推荐
相关产品推荐

