2016-01-26 4 views
5

मैं ऑब्जेक्ट्स के जेसन सरणी को स्ट्रिंग्स के रूप में उन ऑब्जेक्ट्स के साथ बैश सरणी में कैसे पार्स करूं? बाहर विशिष्ट वस्तुओं के बजाय लाइनोंमैं json सरणी को jq के साथ स्ट्रिंग्स के बैश सरणी में कैसे परिवर्तित करूं?

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

लेकिन गूंज प्रिंट:

मैं निम्न कार्य करने की कोशिश कर रहा हूँ। वस्तु का स्वरूप है:

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

और मैं एक api के लिए इसे पारित करने की जरूरत है:

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

उत्तर

8

समस्या यह है कि jq अभी भी सिर्फ पाठ की तर्ज outputting है; आप प्रत्येक सरणी तत्व को एक इकाई के रूप में आवश्यक रूप से संरक्षित नहीं कर सकते हैं। उस ने कहा, जब तक कोई ऑब्जेक्ट किसी ऑब्जेक्ट में मान्य वर्ण नहीं है, आप अभी भी प्रत्येक ऑब्जेक्ट को एक अलग पंक्ति पर आउटपुट कर सकते हैं।

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। पुन: "जब तक कोई नई लाइन किसी ऑब्जेक्ट में मान्य वर्ण नहीं है": चूंकि ये JSON ऑब्जेक्ट्स हैं, यह कोई चिंता नहीं है। – ruakh

+0

आह, मैं गलत धारणा के तहत था कि एक हैश मान में एक नई लाइन दिखाई दे सकती है, लेकिन ऐसा लगता है कि उन्हें '\ n' के रूप में एन्कोड किया जाना आवश्यक है। – chepner

+0

यदि आप 'jq -r' के बजाय' jq -j' का उपयोग करते हैं, तो JQ द्वारा स्वयं को कोई विभाजक नहीं जोड़ा गया है, ताकि आप अपने जेक कोड से अपना स्वयं का (जैसे एनयूएल अक्षर) जोड़ सकें। –

संबंधित मुद्दे