几乎用`jq`自动排序键,但保持" id"密钥,如果存在,在顶部

时间:2018-02-28 15:16:55

标签: json jq

有没有办法使用jq对JSON的键进行排序,但保留名为" id"的键。作为所有树木的第一个后代?能够轻松地将JSON文件相互比较并规范化键盘顺序和格式化是一种确保它们易于匹配的好方法,这很好,但有时候" id"关键是我们正在寻找的关键,如果它被埋在树的中间,它并不总是很容易找到。

例如,这个:

{
    "z-displacement": 3,
    "absorption": 0.4,
    "collections": [
        {
            "b": 12,
            "a": 18,
            "id" 190:,
        },
        {
            "m": 22,
            "id": 169,
            "n": 3,
        },
    ],
    "id": 256767
}

会变成:

{
    "id": 256767,
    "absorption": 0.4,
    "collections": [
        {
            "id" 190:,
            "a": 18,
            "b": 12
        },
        {
            "id": 169,
            "m": 22,
            "n": 3
        }
    ],
    "z-displacement": 3
}

2 个答案:

答案 0 :(得分:1)

假设您使用的是jq 1.4或更高版本,以下内容将执行输入中所有JSON对象的请求,而不仅仅是顶层的JSON对象:

def reorder:
  (if has("id") then {id} else null end) + (to_entries | sort | from_entries );

walk(if type == "object" then reorder else . end)

如果您的jq没有walk/1,您可以从jq常见问题https://github.com/stedolan/jq/wiki/FAQbuiltin.jq的“主”版本中搜索其def

答案 1 :(得分:-1)

我不知道这有多强大,但在这种情况下会得到理想的结果。

jq -S '.' | jq '{id} + .'