有没有更好的方法让我在PowerShell中循环json节点

有没有更好的方法让我在PowerShell中循环json节点,json,powershell,foreach,nested-loops,Json,Powershell,Foreach,Nested Loops,我想知道是否有人能帮我提个建议 我有一个JSON文件,如下所示,其中包含几个不同的节点,出于保密目的,我删除了这些值。我需要能够循环通过JSON提供的每个测试步骤,并拉取状态为failed的步骤的测试 到目前为止,我发现的最简单的方法是为每个循环嵌套(报告->描述->元素->步骤->结果->状态)。我想知道是否有任何PowerShell专家可以帮助我找到一个更干净、更快的解决方案 [ { "description": "", "

我想知道是否有人能帮我提个建议

我有一个JSON文件,如下所示,其中包含几个不同的节点,出于保密目的,我删除了这些值。我需要能够循环通过JSON提供的每个测试步骤,并拉取状态为failed的步骤的测试

到目前为止,我发现的最简单的方法是为每个循环嵌套(报告->描述->元素->步骤->结果->状态)。我想知道是否有任何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": ""
  }
]

您所得到的几乎是在powershell中返回对象的多个“深度”的最佳方法,因为实际上没有一个“深度”

一项改进是强制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似乎无效。你能纠正吗?哇,非常感谢你的帮助,很高兴知道这是最简单的方法。在启动PS脚本之前,我制作了一个C#应用程序,在那里我使用LINQ selectMany和Where循环节点。但我在Powershell中很难获得相同的结果,很高兴知道我做的是正确的事情
foreach($scenario in $feature.elements) {
  # -- Skip foreach $step
  if($scenario.steps.result.status -eq 'Failed') {
    $failedTests.Add((Generate-FullyQualifiedName -etc))
  }
}