如何使用 jq 重建 json 文件的完整内容,只对感兴趣的部分进行操作?

How to use jq to reconstruct complete contents of json file, operating only on part of interest?

到目前为止我见过的所有示例 "reduce" 输出(过滤掉)某些部分。我了解如何对我想要的输入部分进行操作,但我还没有想出如何输出其余内容"untouched"。

具体示例是一个包含多个高级条目的输入文件 "array1"、"field1"、"array2"、"array3"。每个数组内容不同。我想要做的具体处理是通过 "name" 字段对 "array1" 条目进行排序,该字段可通过以下方式进行排序:

jq '.array1 | sort_by(.name)' test.json

但我也希望此输出为 "array1" 以及要保留的所有其他数据。

示例输入:

{
    "field1": "value1",
    "array1":
        [
            { "name": "B", "otherdata": "Bstuff" },
            { "name": "A", "otherdata": "Astuff" }
        ],
    "array2" :
        [
            array2 stuff
        ],
    "array3" :
        [
            array3 stuff
        ]
}

预期输出:

{
    "field1": "value1",
    "array1":
        [
            { "name": "A", "otherdata": "Astuff" },
            { "name": "B", "otherdata": "Bstuff" }
        ],
    "array2" :
        [
            array2 stuff
        ],
    "array3" :
        [
            array3 stuff
        ]
}

我试过使用 map 但我似乎无法获得正确的语法来处理除我想按名称排序的数组之外的任何类型的输入。

无论何时使用赋值运算符(=|=+= 等),表达式的上下文都保持不变。因此,只要您的顶级过滤器是作业,最后您将获得其余数据(应用您的更改)。

在这种情况下,您只是对 array1 数组进行排序,因此您可以只更新数组。

.array1 |= sort_by(.name)