JQ: удалить вложенный ключ и сохранить другой основной ключ массива в целости - PullRequest
2 голосов
/ 14 июля 2020

У меня есть файл json, который выглядит так:

{
  "parents": [{
    // array of objects
  }],
  "modules": {
    "a": 1,
    "b": 2
  }
}

Я хочу удалить их ключ b объектных модулей.

Я выполняю эту команду: jq "with_entries(.value |= del(.b))"

Но это не удается, когда присутствует массив parents. Я получаю

Невозможно проиндексировать массив со строкой «b»

Как заставить команду игнорировать родительский массив и работать только с объектом модулей?

1 Ответ

2 голосов
/ 14 июля 2020

Ваша идея была правильной, но вы пропустили выбор желаемого объекта внутри with_entries(), поэтому ваша операция удаления была предпринята для всех объектов в вашем JSON.

Поскольку запись parents является типом массива, а не объектом, функция del выдает ошибку, что она не может проиндексировать массив с заданным именем. Вам необходимо выполнить

with_entries( select(.key == "modules").value |= del(.b) )

. Функция select() фильтрует этот объект с ключом по имени "modules" и применяет действие удаления только к этому объекту.

jq -проиграть фрагмент

...