Bash jq-使用map函数保留属性的当前排序顺序
我将以下JSON命名为my.JSON 我正试图了解map函数在jq 1.3版中的用法 稍后,我打算将此逻辑(即映射函数)用于复杂的jq过滤器,以保留每个对象中属性的当前排序顺序,因为--sort key选项在jq 1.3版中不可用 我的目标是在使用map函数后按原样输出My.json文件的内容 到目前为止,我已经根据这些答案和建议提出了以下jq命令 这给了我以下输出Bash jq-使用map函数保留属性的当前排序顺序,bash,shell,jq,Bash,Shell,Jq,我将以下JSON命名为my.JSON 我正试图了解map函数在jq 1.3版中的用法 稍后,我打算将此逻辑(即映射函数)用于复杂的jq过滤器,以保留每个对象中属性的当前排序顺序,因为--sort key选项在jq 1.3版中不可用 我的目标是在使用map函数后按原样输出My.json文件的内容 到目前为止,我已经根据这些答案和建议提出了以下jq命令 这给了我以下输出 [ [ { "action": "copy" },
[
[
{
"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"
}
]
我在这里遗漏了什么?JQ1.3不保证对象中键的顺序。其实就这么简单,尽管
map
本身与您注意到的重新排序无关
还要记住,jq的版本非常古老,应该被认为是过时的
但是,在jq 1.3的范围内,您可能可以做任何您真正想做的事情,但是任何重新排序的键的示例都将说明前面的一点。jq 1.3不保证对象中键的顺序。其实就这么简单,尽管
map
本身与您注意到的重新排序无关
还要记住,jq的版本非常古老,应该被认为是过时的
但是,在jq 1.3的范围内,您可能可以做任何您真正想做的事情,但是任何重新排序的键的示例都将说明前面的一点。感谢您的解释。我已经决定迁移到最新版本,因为我没有其他选择。谢谢你的解释。我已经决定迁移到最新版本,因为我没有其他选择。
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"
}
]