Как создать массив JSON и добавить к нему объекты JSON?

Я создаю объекты JSON из заданных данных. Если создается объект JSON, он должен быть добавлен к массиву JSON, который хранится в переменной bash. Этот пакет объектов JSON позже должен быть отправлен через curl.

Код:

declare -a data=('10.4' '100.23' '20.02');
batch = "[]"
for data_object in "${data[@]}"; do
    json=$(jq -n --arg inf $data_object '{data: $inf|tonumber}')
    batch=$(jq '$batch += ["$json"]')
done

Ожидаемый результат после n циклов должен быть:

[
   {
      "data": 10.4
   },
   {
      "data": 100.23
   },
   {
      "data": 20.02
   }
]

Я постоянно получаю эту ошибку: jq: error: $batch is not defined at <top-level>, line 1:. Как я могу это решить?

batch используется в контексте оболочки, он не импортируется автоматически в jq
Inian 15.12.2020 19:48

Ну как batch = "[$(printf '{"information": %s}\n' "${data[@]}" | paste -sd,)]"?

KamilCuk 15.12.2020 19:49

Вам не нужны никакие хакерские операции такого рода, и вы можете сделать все это в jq. Опубликуйте минимальный воспроизводимый пример с необходимым вводом и точным выводом.

Inian 15.12.2020 19:50

Откуда $information?

Inian 15.12.2020 19:54

Я обновил пост, так что он имеет немного больше смысла!

codlix 15.12.2020 19:54
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
5
275
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы, несомненно, могли бы заставить свою программу работать, обновив batch следующим образом:

batch=$(jq --argjson json "$json" '. + [$json]' <<< "$batch")

Однако подход, который вы используете, кажется одновременно хрупким и поразительно неэффективным. Рассматривали ли вы возможность накопления всех элементов в файле (в виде потока сущностей JSON), а когда их нужно объединить в массив, используя jq -s .?

В приведенном конкретном примере было бы достаточно написать:

printf "%s\n" "${data[@]}" |
    jq -n '[{data: inputs}]' |
    curl -d @- <OTHER CURL OPTIONS>

То есть вы можете передавать прямо в curl.

Обратите внимание, что вызов tonumber не нужен, независимо от того, известно ли, что все элементы data являются числами. Для справки, tonumber часто используется в идиоме (tonumber? // .) в случае, если строка или другой ввод не является числовым.

Другой вариант

Если бы над каждым элементом данных нужно было выполнить другие действия, которые jq не может легко обработать:

batch=$(
   (
       for data_object in "${data[@]}"; do
           jq -n --argjson inf "$data_object" '{data: $inf}'
       done
   ) | jq -s .
)

Здесь вызов tonumber излишен, на этот раз благодаря --argjson.

Во-первых, спасибо за ответ - это именно то, что мне было нужно. Я всегда готов учиться и находить лучшие решения, особенно если мои на самом деле настолько плохи, так в чем будет польза от хранения их в отдельных файлах и как это будет выглядеть? Для получения дополнительной информации завиток, который отправляет пакет, вызывается сразу после цикла for.

codlix 15.12.2020 20:09

@FlixRo, добавлено упомянутое решение jq -s в ответ.

ikegami 15.12.2020 21:26

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