用jq重新组织对象字段

时间:2015-07-30 09:15:49

标签: bash jq

我想知道是否有办法使用jq重新组织对象的字段。

我的意思是,鉴于此

{
  "prop1": 1,
  "prop2": {
    "nested": 0
  },
  "prop3": true
}

我想得到这个

{
  "prop1": 1,
  "prop3": true,
  "prop2": {
    "nested": 0
  }
}

我想选择字段的顺序(不考虑字段的类型或字母顺序,我只选择:))

谢谢!

2 个答案:

答案 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}}