如何判断ConvertFrom-Json生成的PSObject是否包含子对象?
判断ConvertFrom-Json生成的PSObject是否包含子对象
要判断ConvertFrom-Json生成的PSObject属性是否包含子对象,核心是检查属性值的类型——嵌套的JSON对象会被转换为PSCustomObject,我们可以通过类型判断来替代不存在的HasChildren属性。
基础实现(仅处理嵌套对象)
针对你提供的JSON结构,修改后的遍历代码如下:
# 读取并转换JSON为PSObject $settings = Get-Content -Raw $pathToFile | ConvertFrom-Json # 定义递归遍历函数 function TraversePSObject { param( [PSCustomObject]$obj ) foreach ($prop in $obj.PSObject.Properties) { if ($prop.Value -is [PSCustomObject]) { # 该属性包含子对象,递归遍历 Write-Host "进入子节点: $($prop.Name)" TraversePSObject $prop.Value } else { # 输出基础键值对 Write-Host "键: $($prop.Name),值: $($prop.Value)" } } } # 启动遍历 TraversePSObject $settings
运行这段代码后,Logging节点会被识别为包含子对象并进入递归,AllowedHosts则直接输出键值对,符合你的预期。
扩展实现(处理数组类型节点)
如果JSON中包含数组(数组内可能嵌套对象),可以扩展判断逻辑,同时处理数组类型:
$settings = Get-Content -Raw $pathToFile | ConvertFrom-Json function TraversePSObject { param($obj) # 先处理数组类型 if ($obj -is [array]) { $index = 0 foreach ($item in $obj) { Write-Host "数组元素索引: $index" TraversePSObject $item $index++ } return } # 处理PSCustomObject类型 if ($obj -is [PSCustomObject]) { foreach ($prop in $obj.PSObject.Properties) { if ($prop.Value -is [PSCustomObject] -or $prop.Value -is [array]) { Write-Host "进入子节点/数组: $($prop.Name)" TraversePSObject $prop.Value } else { Write-Host "键: $($prop.Name),值: $($prop.Value)" } } } else { # 输出基础类型值(如字符串、数字等) Write-Host "值: $obj" } } TraversePSObject $settings
核心判断逻辑总结
- 若属性值类型为
[PSCustomObject]:对应JSON中的嵌套对象,需要深入遍历 - 若属性值类型为
[array]:对应JSON中的数组,需遍历数组内的每个元素,再判断元素是否为对象
内容的提问来源于stack exchange,提问作者Vaccano
相关产品推荐
相关产品推荐

