如何通过 jq 中这些键的键和值对 json 文件进行排序
Posted
技术标签:
【中文标题】如何通过 jq 中这些键的键和值对 json 文件进行排序【英文标题】:How to sort a json file by keys and values of those keys in jq 【发布时间】:2015-07-31 15:04:38 【问题描述】:我们正在使用 Pentaho CTools 库构建一个网站,它有一个图形仪表板编辑器,可以为仪表板的一部分写出 JSON 格式的文件。
我想在签入 git 之前对这些文件进行转换,以便按键对它们进行排序,然后按某些键的值对它们进行排序。目的是让差异更容易,因为编辑器有重新排列所有 json 字段的习惯。
例如,我们可能有这样的事情:
"components":
"rows": [
"id": "CHARTS",
"name": "Charts",
"parent": "UnIqEiD",
"properties": [
"name": "Group",
"type": "Label",
"value": "Charts"
],
"type": "Label",
"typeDesc": "<i>Group</i>"
,
"id": "kjalajsdjf",
"meta_cdwSupport": "true",
"parent": "CHARTS",
"properties": [
"name": "name",
"type": "Id",
"value": "Value1"
,
"name": "title",
"type": "String",
"value": "Value2"
,
"name": "listeners",
"type": "Listeners",
"value": "[]"
,
...
我们能够jq --sort-keys
(http://stedolan.github.io/jq/) 对所有键进行排序,但我正在努力找出如何使用sort_by
函数然后按某些键的值对某些特定元素进行排序(因此,在上面的示例中,例如按properties.name
排序。有什么想法吗?
【问题讨论】:
【参考方案1】:好的,通过 IRC 频道的帮助,我找到了答案。
基本上是这样的:
jq \
'.components.rows|=sort_by(.id)|.components.rows[].properties|=sort_by(.name)' \
file.json > out.json
选择正确的对象,
如果需要,进入数组,
然后sort_by
单个值。
我正在尝试sort_by(.components.rows.id)
,但失败了。
|=
而不是 |
传递值而不是剥离它们。
【讨论】:
注意:对于真正想要使用 CTools.cdfde
文件执行此操作的任何人,对键进行排序似乎是可以的,对属性数组中的 name
元素进行排序也是如此,但对component
rows
by id
是不可以的,它会破坏东西。所以不要这样做......【参考方案2】:
这并不能回答问题,但这是按属性/键排序的另一种方法:
jq --sort-keys . my_file > sorted_file
-或-
jq -S . my_file > sorted_file
【讨论】:
这与问题中提到的--sort-keys
相同。以上是关于如何通过 jq 中这些键的键和值对 json 文件进行排序的主要内容,如果未能解决你的问题,请参考以下文章
java问题,我想在java中存储键值对,以便使用,但是键值对的键和值都有重复元素,使用hashmap会产生覆盖。
如何在iOS swift的tableview中使用json响应中的键和值?