Использование jq для сортировки ключей и значений в json - PullRequest
0 голосов
/ 13 февраля 2019

Кто-нибудь знает, как использовать jq для сортировки ключей и их значений массива в json?

Например:

Перед сортировкой:

{ 
   z:["c","b","a"],
   y:["e", "d", "f"],
   x:["g", "i", "h"]
}

После сортировки:

{
   x:["h", "i", "j"]
   y:["d", "e", "f"],
   z:["a","b","c"]
}

Я пытаюсь использовать

jq --sort-keys 

, но сортирует только ключи, но не включает их значения.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

У меня также возникает желание предложить альтернативное решение: полагаться на другую мою утилиту Unix jtc и некоторые стандартные Unix Cli:

Firstпример и затем объяснение (при условии, что ваш json находится в file.json):

bash $ jtc -w[:] -eu echo {} \| jtc -rw[:] \| sort \| paste -s -d, - \| sed -E 's/(.*)/[\1]/g' \; file.json 
{
   "x": [
      "g",
      "h",
      "i"
   ],
   "y": [
      "d",
      "e",
      "f"
   ],
   "z": [
      "a",
      "b",
      "c"
   ]
}
bash $ 

Объяснение:

1.jtc сортирует ключи в объектах JSON по умолчанию.Путь обхода -w[:] перечисляет все узлы в узле json верхнего уровня (который здесь является объектом):

bash $ jtc -w[:] -r file.json 
[ "g", "i", "h" ]
[ "e", "d", "f" ]
[ "c", "b", "a" ]
bash $ 

2.-u обновляет (заменяет) каждую входящую запись, тогда как -e позволяет выполнять оценку оболочки для проходной записи: например, jtc -w[:] -eu <...shell cli...> \; file.json.Кроме того, каждый экземпляр {} будет интерполирован с проходной записью.

Таким образом, например, первая пройденная запись ([ "g", "i", "h" ]) будет интерполирована и оценена следующим образом:

echo '[ "g", "i", "h" ]' | jtc -rw[:] | sort | paste -s -d, - | sed -E 's/(.*)/[\1]/g'
["g","h","i"]

где:

  • jtc -rw[:] перечисляет все записи (в каждой строке)
  • sort сортирует их все
  • paste -s -d, - связывает все строки назадв одну строку через запятую ,
  • sed -E 's/(.*)/[\1]/g' ставит квадратные скобки [, ] вокруг отсортированных записей

3.В результате json заменяет пошаговую запись во внешнем jtc.И затем тот же процесс повторяется для остальных (пройденных) массивов.

0 голосов
/ 14 февраля 2019

Если вы хотите полагаться на параметр командной строки --sort-keys для сортировки ключей, то вы можете убедиться, что все массивы отсортированы, написав:

walk(if type=="array" then sort else . end)

Если вы хотите объектключи для внутренней сортировки (т. е. до того, как будет сгенерирован окончательный результат), тогда вы могли бы дополнить вышеперечисленное с помощью следующего фильтра:

walk(if type=="array" then sort
     elif type == "object" then to_entries | sort | from_entries
     else . end)

Альтернативы

Если по какой-то причине вы не хотитечтобы использовать walk, вы можете использовать собственное решение, используя комбинацию sort (для массивов JSON) и to_entries|sort|from_entries (для объектов JSON).

...