2016-01-26 17 views
5

Bir json dizisi nesnesini, dizeler olarak bu nesnelerle birlikte bir bash dizisine nasıl ayrışırım?Json dizisini jq ile dizelerin bash dizisine nasıl dönüştürebilirim?

aşağıdaki yapmaya çalışıyorum:

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

Ama yankı baskılar dışarı yerine belirli nesnelerin hatlarını.

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

ve bir API için geçmesi gereken: nesnenin biçimi

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

cevap

8

sorun jq yine de sadece metin satırlarını çıkış olmasıdır; her dizi öğesini tek bir birim olarak koruyamazsınız. Bu, yeni bir satırın herhangi bir nesnede geçerli bir karakter olmadığı sürece,, yine de her nesneyi ayrı bir hatta alabilirsiniz.

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

Tabii varsayımı altında, bir dizi oluşturmak bash 4'te readarray komutunu kullanabilirsiniz:

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

+1. Re: "bir satırsonu herhangi bir nesnede geçerli bir karakter olmadığı sürece": Bunlar JSON nesneleri olduğundan, bu bir sorun değildir. – ruakh

+0

Ah, bir satırsonu değerinde yeni bir satırın görünebileceği yanlış varsayımın altındaydım, ancak '\ n' olarak kodlanması gerekiyor gibi görünüyor. – chepner

+0

'jq -r' yerine' jq -j' komutunu kullanırsanız, JQ tarafından eklenen bir ayırıcı yoktur, böylece kendi kodunuzdan kendi NUL'leri (NUL edebi gibi) ekleyebilirsiniz. –

İlgili konular