有没有办法使用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
}
假设您使用的是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 FAQ https://github.com/stedolan/jq/wiki/FAQ或builtin.jq的“主”版本中搜索它的def。
我不知道这是多么强大,但它在这种情况下得到了理想的结果。
jq -S '.' | jq '{id} + .'