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

时间:2016-12-20 23:40:53

标签: json jq

到目前为止,我见过的所有例子都“减少”输出(过滤掉)某些部分。我理解如何操作我想要的输入部分,但我还没有弄清楚如何输出其他内容“未触动”。

特定示例是一个输入文件,其中包含几个高级条目“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但是我似乎无法正确处理语法,以便能够处理除了我希望按名称排序的数组之外的任何类型的输入。

1 个答案:

答案 0 :(得分:1)

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

在这种情况下,您只需对array1数组进行排序,以便只更新数组。

.array1 |= sort_by(.name)