如何按jq中的键和键值对json文件进行排序

时间:2015-05-19 16:45:23

标签: json git sorting jq

我们正在使用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-keyshttp://stedolan.github.io/jq/)对所有键进行排序,但我很难找到如何使用sort_by函数对某些特定元素进行排序通过某些键的值(因此,在上面的示例中,按properties.name排序。例如。任何想法?

2 个答案:

答案 0 :(得分:46)

在IRC频道提供一些帮助后,我找到了答案。

基本上,它看起来像这样:

> jq '.components.rows|=sort_by(.id)|.components.rows[].properties|=sort_by(.name)' file.json > out.json

所以你选择正确的对象,在需要的时候进入数组,然后sort_by只取一个值(我试图sort_by(.components.rows.id)失败了。)

| =而不是|传递值而不是剥离它们。

答案 1 :(得分:1)

如果要按属性对文件排序,此命令可能会有用:

jq -S '.' "$file" > "$file"_sorted;