2016-01-26 5 views
5

Как разобрать массив json объектов в массив bash с этими объектами в виде строк?Как преобразовать массив json в массив bash строк с jq?

Я пытаюсь сделать следующее:

CONVO=$(get_json_array | jq '.[]') 
for CONVERSATION in $CONVERSATIONS 
do 
    echo "${CONVERSATION}" 
done 

но эхо распечатывает линии вместо конкретных объектов. Формат объекта:

{ "key1":"value1", "key2": "value2"} 

и мне нужно, чтобы передать его АНИ:

api_call '{ "key1":"value1", "key2": "value2"}' 

ответ

8

Проблема заключается в том, что jq еще только вывод строк текста; , вы не можете сохранить каждый элемент массива как единое целое. Тем не менее, пока новая строка не является допустимым символом в любом объекте, вы все равно можете выводить каждый объект на отдельной строке.

get_json_array | jq -c '.[]' | while read object; do 
    api_call "$object" 
done 

Конечно, при этом предположении, можно использовать команду readarray в bash 4, чтобы создать массив:

readarray -t conversations < <(get_son_array | jq -c '.[]') 
for conversion in "${conversations[@]}"; do 
    api_call "$conversation" 
done 
+0

+1. Re: «до тех пор, пока новая строка не является допустимым символом в любом объекте»: поскольку это объекты JSON, это не проблема. – ruakh

+0

Ах, я был ошибочно допущен, что новая строка может появиться в хеш-значении, но похоже, что они должны быть закодированы как '\ n'. – chepner

+0

Если вы используете 'jq -j' вместо' jq -r', разделитель не добавляется самим JQ, поэтому вы можете добавить свой собственный (например, литералы NUL) из вашего jq-кода. –

Смежные вопросы