Подтвердить что ты не робот

Как отсортировать json файл по ключам и значениям этих ключей в 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-keys (http://stedolan.github.io/jq/) сортировать все ключи, но я изо всех сил пытаюсь выяснить, как для использования функции sort_by для сортировки определенных определенных элементов по значению определенных ключей (так, в приведенном выше примере сортировка по properties.name например. Любые идеи?

4b9b3361

Ответ 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), который не удался).

the | = вместо | пропускает значения, а не снимает их.

Ответ 2

Если вы хотите отсортировать файл по атрибутам, эта команда может быть полезна:

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