LINUX.ORG.RU

jq создать массив json из отдельных строк

 , ,


1

1

Есть файл test.json:

{
"response": "ok",
"data": [
    {
        "number": "123",
        "status": "OK"
    },
    {
        "number": "456",
        "status": "disabled"
    },
    {
        "number": "789",
        "status": "false"
    }
]
}

Есть переменная внутри которой должны лежать номера

MyNumbers=`cat test.json | jq '.data[].number'`

Они там лежат вот так:

"123"
"456"
"789"

а нужно вот так:

[
"123",
"456",
"789"
]

Как в переменную проще всего поместить нужные номера в виде массива?

Ответ на: комментарий от Infra_HDC

нет не предлагали. но есть что-то похожее на решение но не совсем что что нужно.

MyNumbers=`cat test.json | jq -r '.data[].number' | jq -R  . | jq -s '{ "Mydata" :. }'`

в итоге лишняя переменная «Mydata», без нее не получается пока сделать:

{
  "Mydata": [
    "123",
    "456",
    "789"
  ]
}

AnastasiaM
() автор топика
Ответ на: комментарий от AnastasiaM

почему бы не взять нормальный яп в режиме комманд лаин вместо того что бы собирать кусками все это?

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

потому что уже есть код который работает и там нужно поправить пару строк. Если переписывать все на другой ЯП тогда нужно переписать около 800 строк кода. Пару строк проще чем 800 строк. И я сама не в восторге от этого bash, но что поделать, уже есть и оно работает и трогать его не сильно хочется.

AnastasiaM
() автор топика
Последнее исправление: AnastasiaM (всего исправлений: 1)
Ответ на: комментарий от Miguel

мануал читала, что-то похожее есть в решении выше, но оно кривое это решение. Больше ничего похожего в манауле нет.

AnastasiaM
() автор топика
Ответ на: комментарий от AnastasiaM

Кроме «Object Identifier-Index», «Pipe» и «map(x)» для решения этой задачи ничего не нужно. И да, вызывать jq несколько раз подряд — это идиотизм.

Miguel ★★★★★
()
Ответ на: комментарий от TDrive

Молодец, сделал чужую домашку за так.

А если серьёзно, как только у тебя в работе возникает json — так сразу бери jq. Экономит уйму времени и сил.

Miguel ★★★★★
()
Последнее исправление: Miguel (всего исправлений: 1)

Решение через костыли, создаем Mydata, потом читаем эту переменную. ruby ставить не пришлось:

MyNumbers=`cat test.json | jq -r '.data[].number' | jq -R  . | jq -s '{ "Mydata" :. }' | jq '.Mydata'`
AnastasiaM
() автор топика
Ответ на: комментарий от AnastasiaM

Мдя.

cat test.json | jq '.data|map(.number)'

Всё.

Следующий вопрос будет, вероятно, «как посчитать 2+2».

Блин, да даже

cat test.json | jq '[.data[].number]'

подошло бы.

Miguel ★★★★★
()
Последнее исправление: Miguel (всего исправлений: 1)
Ответ на: комментарий от Siborgium

Не надо так делать.

Потому что потом тебе понадобится переделать это на

curl http://mycoolsitewithoutssl/test.json | jq ...
и ты будешь плеваться, что сразу не сделал нормально.

Miguel ★★★★★
()
Последнее исправление: Miguel (всего исправлений: 1)
 seq 1 3 | jq --slurp '.'
bl ★★★
()
Ответ на: комментарий от Miguel

Потому что потом тебе понадобится переделать это

Ну если придираться к как надо, то в переменную надо запихивать массив чисел MyNumber=(123 456 789), а никак не строку [ "123", "456", "789" ] с дурацкими «тут запятую ставим, тут нет», кавычки, скобочки... jq пусть и думает, благо умеет.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.