jq-使用map函数来保留当前排序的属性顺序



我有以下JSON,名称为my.JSON.

[
{
"action": "copy",
"artifact_location": "one foo one"
},
{
"action": "copy",
"artifact_location": "one bar one"
},
{
"action": "remove",
"artifact_location": "two foo two"
}
]

我正在尝试了解jq 1.3版映射函数的用法。

稍后,我打算将此逻辑(即映射函数(用于复杂的jq过滤器,以将每个对象中属性的当前排序顺序保留为--排序键选项是,而不是jq版本1.3中可用

我的目标是在使用map函数后输出My.json文件的内容。

到目前为止,我已经根据答案[1]和[2]提出了以下jq命令。

jq -r 'map(to_entries | map({(.key): .value}))' my.json

这给了我以下的输出。

[
[
{
"action": "copy"
},
{
"artifact_location": "one foo one"
}
],
[
{
"action": "copy"
},
{
"artifact_location": "one bar one"
}
],
[
{
"action": "remove"
},
{
"artifact_location": "two foo two"
}
]
]

如果我将添加函数组合如下。

jq -r 'map(to_entries | map({(.key): .value}) | add )' my.json

更改以前排序的属性顺序,类似于下面的输出。

[
{
"artifact_location": "one foo one",
"action": "copy"
},
{
"artifact_location": "one bar one",
"action": "copy"
},
{
"artifact_location": "two foo two",
"action": "remove"
}
]

我在这里错过了什么?

jq 1.3不保证对象中键的顺序。实际上就这么简单,尽管map本身与您注意到的重新排序无关。

还要记住,jq的那个版本非常旧,应该被认为是过时的。

然而,在jq1.3的范围内,您可能可以做真正想要做的任何事情,但任何重新排序键的例子都只说明了前一点。

最新更新