2016-01-26 15 views
5

Come analizzare un array JSON di oggetti in un array bash con tali oggetti come stringhe?Come posso convertire json array in bash array di stringhe con jq?

che sto cercando di fare quanto segue:

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

Ma le stampe eco le linee al posto degli oggetti specifici. Il formato dell'oggetto è:

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

e devo passare a un api:

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

risposta

8

Il problema è che jq è ancora solo output righe di testo; non è possibile conservare necessariamente ogni elemento dell'array come una singola unità. Detto questo, finché una nuova riga non è un carattere valido in alcun oggetto, è ancora possibile stampare ciascun oggetto su una riga separata.

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

Naturalmente, in tale ipotesi, è possibile utilizzare il comando readarray in bash 4 per costruire un array:

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

+1. Ri: "fino a quando una nuova riga non è un carattere valido in qualsiasi oggetto": poiché questi sono oggetti JSON, non è una preoccupazione. – ruakh

+0

Ah, ero sotto l'assunto errato che una nuova riga potesse apparire in un valore hash, ma sembra che debbano essere codificati come '\ n'. – chepner

+0

Se si usa 'jq -j' invece di' jq -r', non c'è nessun separatore aggiunto da JQ stesso, quindi è possibile aggiungere il proprio (come i letterali NUL) dal codice jq. –

Problemi correlati