Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] BASH - парсинг JSON (http://forum.oszone.net/showthread.php?t=350864)

dahiko 14-03-2022 21:30 2981676

BASH - парсинг JSON
 
Всем привет!

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

Ответ в формате 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 2981680

Нашел решение. Нужно использовать 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 2981685

читатйте хелп jq у его есть полезные флаги чтобы убрать кавычки из выдачи

dahiko 15-03-2022 22:19 2981736

Действительно есть такое. Оказывается можно использовать -r для обрезания кавычек

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


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

Serguei Kouzmine 16-03-2022 03:28 2981744

прочитать документацию помогает ....

Код:

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 2981877

Цитата:

Цитата Serguei Kouzmine
'.resources[-1]' »

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


Время: 18:16.

Время: 18:16.
© OSzone.net 2001-