如何通过 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 文件进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何比较两个json文件并在对象中返回不匹配的键和值

java问题,我想在java中存储键值对,以便使用,但是键值对的键和值都有重复元素,使用hashmap会产生覆盖。

如何在iOS swift的tableview中使用json响应中的键和值?

Json 中的键和值

将值转换为 Spark 数据集中的列(将列的键和值对转换为常规列)[重复]

计算 json 对象中键的出现次数 - IMPALA/HIVE