Слияние двух массивов JSON с использованием jq - PullRequest
0 голосов
/ 12 октября 2019

Я бы хотел объединить массивы '.fileStats' и '.files', чтобы был только один массив.

Начальный JSON:

{"arguments":{"torrents":[{"fileStats":[{"bytesCompleted":0,"priority":0,"wanted":false},{"bytesCompleted":0,"priority":0,"wanted":true},{"bytesCompleted":0,"priority":0,"wanted":true}],"files":[{"bytesCompleted":0,"length":30,"name":"1.txt"},{"bytesCompleted":0,"length":99,"name":"2.exe"},{"bytesCompleted":0,"length":4833317512,"name":"3.iso"}]}]},"result":"success"}

Пример объекта после объединения массивов:

{
  "bytesCompleted": 0,
  "length": 30,
  "name": "1.txt",
  "priority": 0,
  "wanted": true
}

Iмы использовали другой подход с помощью «выравнивания»:

.arguments.torrents[] | map(to_entries) | flatten | group_by(.key)

, но возможность выбрать объекты на основе того, что «.wanted» имеет значение true / false, а затем получить «.name» более желательна.

1 Ответ

0 голосов
/ 12 октября 2019
jq '.arguments.torrents[] | range(.fileStats|length) as $i| select(.fileStats[$i].wanted)| .fileStats[$i]+.files[$i]'

Я думаю, что приведенный выше код делает то, что вы хотите. Это дает следующий вывод с вашим вводом.

{
  "bytesCompleted": 0,
  "priority": 0,
  "wanted": true,
  "length": 99,
  "name": "2.exe"
}
{
  "bytesCompleted": 0,
  "priority": 0,
  "wanted": true,
  "length": 4833317512,
  "name": "3.iso"
}

Для получения более подробной информации, пожалуйста, посмотрите «Переменная», «диапазон», «длина», «выбор» и «слияние» в руководстве jq. https://stedolan.github.io/jq/manual/

...