Как добавить поле JSON в корневой объект JSON с помощью jq

Я пытаюсь создать следующую структуру объекта JSON:

{
  "hard-coded-value": false,
  "dynamic-value-1": true,
  "dynamic-value-2": true,
  "dynamic-value-3": true
}

Мой массив динамических значений называется DYNAMIC_VALUES.

Я написал следующий код bash:

DYNAMIC_VALUES=("dynamic-value-1" "dynamic-value-2" "dynamic-value-3")

JSON_OBJECT=$( jq -n '{"hard-coded-value": false}' )

for i in "${DYNAMIC_VALUES[@]}"
do
    JSON_OBJECT+=$( jq -n \
                      --arg key "$i" \
                      '{($key): true}' )
done

echo $JSON_OBJECT

Приведенный выше код печатает следующее

{ "hard-coded-value": false }{ "dynamic-value-1": true }{ "dynamic-value-2": true }{ "dynamic-value-3": true }

Я хочу, чтобы этот вывод выглядел так же, как вывод, описанный в верхней части этого вопроса, но я не могу понять, как сообщить jq о добавлении к корневому объекту JSON вместо создания группы объектов.

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
398
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Там не нужна петля.

$ dynamic_values=('dynamic-value-1' 'dynamic-value-2' 'dynamic-value-3')
$ printf '%s\n' "${dynamic_values[@]}" | jq -nR '{hardcoded_value: false} | .[inputs] = true'
{
  "hardcoded_value": false,
  "dynamic-value-1": true,
  "dynamic-value-2": true,
  "dynamic-value-3": true
}

Это сломается, если один из элементов массива содержит перевод строки. Для этого в JQ 1.6 есть --args, которые можно использовать, как показано ниже.

$ dynamic_values=('dynamic-value-1' $'dynamic-value-2\n' 'dynamic-value-3')
$ jq -n '{hardcoded_value: false} | .[$ARGS.positional[]] = true' --args "${dynamic_values[@]}"
{
  "hardcoded_value": false,
  "dynamic-value-1": true,
  "dynamic-value-2\n": true,
  "dynamic-value-3": true
}

Ах, я полностью пропустил опцию --args в руководстве - спасибо! Есть ли способ добавить строку к каждому элементу массива? Что-то вроде --args "run-${dynamic_values[@]}" для создания «run-dynamic-value-1», «run-dynamic-value-2» и т. д. Одним из преимуществ цикла, который у меня был, была возможность добавлять строку в начало, выполняя --arg key run-"$i".

Dan Levy 15.12.2020 03:32

@ Дэн --args "${dynamic_values[@]/#/run-}"

oguz ismail 15.12.2020 03:58

Другие вопросы по теме