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

#bash #jq

#bash #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 вместо создания группы объектов.

Ответ №1:

Вам не нужен цикл там.

 $ dynamic_values=('dynamic-value-1' 'dynamic-value-2' 'dynamic-value-3')
$ printf '%sn' "${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-2n' 'dynamic-value-3')
$ jq -n '{hardcoded_value: false} | .[$ARGS.positional[]] = true' --args "${dynamic_values[@]}"
{
  "hardcoded_value": false,
  "dynamic-value-1": true,
  "dynamic-value-2n": true,
  "dynamic-value-3": true
}
 

Комментарии:

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

2. @Dan --args "${dynamic_values[@]/#/run-}"