我想知道是否有办法使用jq重新组织对象的字段。
我的意思是,鉴于此
{
"prop1": 1,
"prop2": {
"nested": 0
},
"prop3": true
}
我想得到这个
{
"prop1": 1,
"prop3": true,
"prop2": {
"nested": 0
}
}
我想选择字段的顺序(不考虑字段的类型或字母顺序,我只选择:))
谢谢!
答案 0 :(得分:1)
唯一安全的选择是手动生成json字符串,并按照您希望的方式排序属性。无法保证您保留对象设置属性的顺序。
您可以借助此功能执行此操作:
def inorder(names): names as $names | . as $obj
| "{\($names | map("\(@json):\($obj[.])") | join(","))}"
;
然后使用它:
inorder(["prop1", "prop3", "prop2"])
请记住,这将返回一个字符串。您希望获取原始输出以将其作为对象取回。
答案 1 :(得分:0)
以下是上面给出的“有序”的变体。直接构造所需的JSON对象(不是字符串化版本)。这适用于jq 1.4和1.5,因为(默认情况下)密钥按创建顺序有效存储。
def orderKeys(keys):
. as $in
| reduce keys[] as $key ({}; . + { ($key): $in[$key] });
# Example:
orderKeys( ["prop1", "prop3", "prop2"] )
将上述文件命名为order-keys.jq,并在任务描述中使用JSON作为输入,命令:
$ jq -M -n -c -f order-keys.jq
产生
{"prop1":1,"prop3":true,"prop2":{"nested":0}}