用 jq 替换数组值(如果存在)

Replace array values if they exist with jq

虽然我经常使用 jq,但我主要是为了完成更简单的任务。这个把我的脑子打成了一个结。

我有一些单元测试的 JSON 输出需要修改。具体来说,我需要删除(或替换)一个错误值,因为测试框架生成的输出长达数百行。

JSON 看起来像这样:

{
  "numFailedTestSuites": 1,
  "numFailedTests": 1,
  "numPassedTestSuites": 1,
  "numPassedTests": 1,
  ...
  "testResults": [
    {
      "assertionResults": [
        {
          "failureMessages": [
            "Error: error message here"
          ],
          "status": "failed",
          "title": "matches snapshot"
        },
        {
          "failureMessages": [
            "Error: another error message here",
            "Error: yet another error message here"
          ],
          "status": "failed",
          "title": "matches another snapshot"
        }
      ],
      "endTime": 1617720396223,
      "startTime": 1617720393320,
      "status": "failed",
      "summary": ""
    },
    {
      "assertionResults": [
        {
          "failureMessages": [],
          "status": "passed",
        },
        {
          "failureMessages": [],
          "status": "passed",
        }
      ]
    }
  ]
}

我想将 failureMessages 中的每个元素替换为通用 failed 消息或自身的截断版本(假设为 100 个字符)。

棘手的部分(对我来说)是 failureMessages 是一个数组,可以有 0-n 个值,我需要修改所有这些值。

我知道我可以用 select(.. | .failureMessages | length > 0) 找到非空数组,但这就是我所能得到的,因为我实际上不需要 select 项,我需要替换它们并得到完整 JSON 返回。

最简单的解决方案是:

.testResults[].assertionResults[].failureMessages[] |= .[0:100]

检查一下online

在线示例仅保留失败消息的前 10 个字符,以显示对您在问题中发布的示例 JSON 的影响(它包含简短的错误消息)。

在 JQ 文档中阅读有关 array/string slice (.[a:b]) and update assignment (|=) 的内容。