Войти

Показать полную графическую версию : [решено] BASH - парсинг JSON


dahiko
14-03-2022, 21:30
Всем привет!

С помощью bash скрипта обращаюсь к API и получают ответ в формате JSON

{
"meta": {
"query_time": 0.162813486,
"pagination": {
"offset": 0,
"limit": 100,
"total": 11
},
"powered_by": "reports",
"trace_id": "b51df724-6ed1-4636-822e-4cce18d934c9"
},
"resources": [
"008a7304b0d642878ebc9c8067d5eaa5",
"07ec9c1e34c8446c82d299d294d4f2c6",
"1e63584b95304437a82639543ce9cdda",
"69ad97b63b574136be8b543f69f162cd",
"e31275236df543388ab3f58f5ed1fd5e",
"f6f9dc925c7342d5b7bfb6ed218b3a71",
"fd6e963230354e34b21bc9ada60b13dd",
"aedaba4be84b48a3be585a5f24ea911f",
"5aa135b264e648e29aa440c7e02c1d0b",
"efc44841194b40809f9427ca5d466cd2",
"50d410420e064b908144204045a68336"
],
"errors": []
}

В таком ответе в resources может быть разное количество ID-шников (от 1 до 31). Надо с помощью bash распрасить так, чтобы всегда получать первый ID в этом ответе. То есть получить 008a7304b0d642878ebc9c8067d5eaa5

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

dahiko
14-03-2022, 22:13
Нашел решение. Нужно использовать JQ. В итоге после API запроса добавить обращение к первому элементу в массиве:
MY_API_REQUEST | jq '.resources[0]'

Кстати, при получении элемента массива он возвращается с кавычками. Можно их убрать вот такой конструкцией
MY_API_REQUEST | jq '.resources[0]' | sed -e "s/^.\{,1\}//;s/.\{,1\}$//"


С помощью sed убираем первый и последний символ строки.

Serguei Kouzmine
15-03-2022, 03:19
читатйте хелп jq у его есть полезные флаги чтобы убрать кавычки из выдачи

dahiko
15-03-2022, 22:19
Действительно есть такое. Оказывается можно использовать -r для обрезания кавычек

MY_API_REQUEST | jq -r '.resources[0]'


Теперь появилась еще одна задача - нужно определить последний элемент в массиве. Кто может подсказать, как это сделать?
Наверное нужно посчитать количество элементов в массиве и потом обращаться к последнему. Но как это сделать, не пойму никак.

Serguei Kouzmine
16-03-2022, 03:28
прочитать документацию помогает ....


cat a.js | jq '.'



{
"x": [
"a",
"b",
"c",
"d"
]
}



cat a.js | jq -cr '.x[-1]'

d

кстати для мета программирования

'.resources[-1]'
и
'.resources|.[-1]'

раносильны

dahiko
18-03-2022, 07:48
'.resources[-1]' »

Спасибо. Да, позиция "-1" это последний элемент в массиве.




© OSzone.net 2001-2012