有没有更好的方法让我循环遍历 PowerShell 中的 json 个节点
Is there a better way for me to loop through json nodes in PowerShell
不知道有没有人可以帮我提个建议。
我有一个 JSON 文件,如下所示,其中包含几个不同的节点,出于保密目的,我删除了这些值。我需要能够遍历 JSON 提供的每个测试步骤,并提取具有失败状态的步骤的测试。
到目前为止,我发现这样做的最简单方法是为每个循环嵌套(报告-> 描述-> 元素-> 步骤-> 结果-> 状态)我想知道是否有任何 PowerShell 大师可以帮我找到一个更清洁、更快速的解决方案吗?
[
{
"description": "",
"elements": [
{
"description": "",
"id": "",
"keyword": "Scenario",
"line": 9,
"name": "",
"tags": [
{
"name": "",
"line": 1
},
{
"name": "",
"line": 1
},
{
"name": "",
"line": 1
}
],
"steps": [
{
"keyword": "Given ",
"line": 0,
"match": {
"location": ""
},
"name": "",
"result": {
"duration": 41560.8294,
"error_message": null,
"status": "Failed"
}
}
],
"name": "",
"uri": ""
},
{
"description": "",
"elements": [
{
"description": "",
"id": "",
"keyword": "Scenario",
"line": 14,
"name": "",
"tags": [
{
"name": "",
"line": 1
},
{
"name": "",
"line": 1
},
{
"name": "",
"line": 1
},
{
"name": "",
"line": 1
},
{
"name": "",
"line": 1
}
],
"steps": [
{
"keyword": "Given ",
"line": 0,
"match": {
"location": ""
},
"name": "",
"result": {
"duration": 17133.4242,
"error_message": ,
"status": ""
}
}
],
"name": "",
"uri": ""
}
]
[String]$report = Get-Content $inputPath
[System.Object[]]$json = ConvertFrom-Json -InputObject "$report"
[String[]]$failedTests = @()
foreach($feature in $json)
{
foreach($scenario in $feature.elements)
{
foreach($step in $scenario.steps)
{
if(($scenario.steps).Where({ $step.result.status -eq "Failed" }, 'First').Count -gt 0)
{
$failedTests += Generate-FullyQualifiedName $ProjectName $feature.name $scenario.name
break
}
}
}
}
你得到的几乎是在 powershell 中 return 对象的多个“深度”的最佳方法,因为实际上并没有 .
一个改进是强制powershell使用[list[]]
类型的对象,而不是$foo = @()
创建的默认固定长度[System.Array]
,每次都必须销毁并重新创建它用 +=
扩展。相反,请尝试使用:
$failedTests = [System.Collections.Generic.List[String]]::new()
# loops...
$failedTests.Add((Generate-FullyQualifiedName -etc))
您也不需要遍历每个步骤来检查场景是否失败:
foreach($scenario in $feature.elements) {
# -- Skip foreach $step
if($scenario.steps.result.status -eq 'Failed') {
$failedTests.Add((Generate-FullyQualifiedName -etc))
}
}
在大多数情况下,我会坚持使用您正在执行的循环。根据每个对象实际有多大,在数组索引 int 上迭代而不是将整个 $feature
对象分配给一个变量可能会更快(也更难看),但我怀疑它在这里会有多大帮助。
不知道有没有人可以帮我提个建议。
我有一个 JSON 文件,如下所示,其中包含几个不同的节点,出于保密目的,我删除了这些值。我需要能够遍历 JSON 提供的每个测试步骤,并提取具有失败状态的步骤的测试。
到目前为止,我发现这样做的最简单方法是为每个循环嵌套(报告-> 描述-> 元素-> 步骤-> 结果-> 状态)我想知道是否有任何 PowerShell 大师可以帮我找到一个更清洁、更快速的解决方案吗?
[
{
"description": "",
"elements": [
{
"description": "",
"id": "",
"keyword": "Scenario",
"line": 9,
"name": "",
"tags": [
{
"name": "",
"line": 1
},
{
"name": "",
"line": 1
},
{
"name": "",
"line": 1
}
],
"steps": [
{
"keyword": "Given ",
"line": 0,
"match": {
"location": ""
},
"name": "",
"result": {
"duration": 41560.8294,
"error_message": null,
"status": "Failed"
}
}
],
"name": "",
"uri": ""
},
{
"description": "",
"elements": [
{
"description": "",
"id": "",
"keyword": "Scenario",
"line": 14,
"name": "",
"tags": [
{
"name": "",
"line": 1
},
{
"name": "",
"line": 1
},
{
"name": "",
"line": 1
},
{
"name": "",
"line": 1
},
{
"name": "",
"line": 1
}
],
"steps": [
{
"keyword": "Given ",
"line": 0,
"match": {
"location": ""
},
"name": "",
"result": {
"duration": 17133.4242,
"error_message": ,
"status": ""
}
}
],
"name": "",
"uri": ""
}
]
[String]$report = Get-Content $inputPath
[System.Object[]]$json = ConvertFrom-Json -InputObject "$report"
[String[]]$failedTests = @()
foreach($feature in $json)
{
foreach($scenario in $feature.elements)
{
foreach($step in $scenario.steps)
{
if(($scenario.steps).Where({ $step.result.status -eq "Failed" }, 'First').Count -gt 0)
{
$failedTests += Generate-FullyQualifiedName $ProjectName $feature.name $scenario.name
break
}
}
}
}
你得到的几乎是在 powershell 中 return 对象的多个“深度”的最佳方法,因为实际上并没有 .
一个改进是强制powershell使用[list[]]
类型的对象,而不是$foo = @()
创建的默认固定长度[System.Array]
,每次都必须销毁并重新创建它用 +=
扩展。相反,请尝试使用:
$failedTests = [System.Collections.Generic.List[String]]::new()
# loops...
$failedTests.Add((Generate-FullyQualifiedName -etc))
您也不需要遍历每个步骤来检查场景是否失败:
foreach($scenario in $feature.elements) {
# -- Skip foreach $step
if($scenario.steps.result.status -eq 'Failed') {
$failedTests.Add((Generate-FullyQualifiedName -etc))
}
}
在大多数情况下,我会坚持使用您正在执行的循环。根据每个对象实际有多大,在数组索引 int 上迭代而不是将整个 $feature
对象分配给一个变量可能会更快(也更难看),但我怀疑它在这里会有多大帮助。