Jq का उपयोग करके JSON से प्रमुख नाम कैसे प्राप्त करें


128

curl http://testhost.test.com:8080/application/app/version | jq '.version' | jq '.[]'

उपरोक्त कमांड केवल नीचे दिए गए मानों को आउटपुट करता है:

"madireddy@test.com"

"2323"

"test"

"02-03-2014-13:41"

"application"

मैं नीचे के बजाय मुख्य नाम कैसे प्राप्त कर सकता हूं:

email

versionID

context

date

versionName

इस तरह । अनुभाव..विवचन: {"अभिलेखागार-संस्करण": "प्लेक्सस अभिलेखागार", "बिल्ड-आईडी": "", "बिल्ड-जेडडीके": "1.7.0_07", "बिल्ड-नंबर": "", "बिल्ड-" टैग ":" "," बिल्ट-बाय ":" सेटर "," क्रिएट-बाय ":" अपाचे मावेन "," कार्यान्वयन-शीर्षक ":" नॉर्थस्टार "," कार्यान्वयन-विक्रेता-आईडी "" com.test। testPack "," कार्यान्वयन-संस्करण ":" testBox "," Manifest-Version ":" 1.0 "," appname ":" testApp "," build-date ":" 02-03-2014-13: 41 "," संस्करण ":" टेस्टबॉक्स ",

क्या आप कृपया उदाहरण डेटा जोड़ सकते हैं जो एपीआई से बाहर आ रहा है और इनपुट है jq?
कार्ल जी

जवाबों:


182

आप उपयोग कर सकते हैं:

$ jq 'keys' file.json
$ cat file.json:
{ "Archiver-Version" : "Plexus Archiver", "Build-Id" : "", "Build-Jdk" : "1.7.0_07", "Build-Number" : "", "Build-Tag" : "", "Built-By" : "cporter", "Created-By" : "Apache Maven", "Implementation-Title" : "northstar", "Implementation-Vendor-Id" : "com.test.testPack", "Implementation-Version" : "testBox", "Manifest-Version" : "1.0", "appname" : "testApp", "build-date" : "02-03-2014-13:41", "version" : "testBox" }

$ jq 'keys' file.json
[
  "Archiver-Version",
  "Build-Id",
  "Build-Jdk",
  "Build-Number",
  "Build-Tag",
  "Built-By",
  "Created-By",
  "Implementation-Title",
  "Implementation-Vendor-Id",
  "Implementation-Version",
  "Manifest-Version",
  "appname",
  "build-date",
  "version"
]

अद्यतन: इन कुंजियों का उपयोग करके एक BASH सरणी बनाने के लिए:

BASH 4+ का उपयोग करना:

mapfile -t arr < <(jq -r 'keys[]' ms.json)

पुराने BASH पर आप कर सकते हैं:

arr=()
while IFS='' read -r line; do
   arr+=("$line")
done < <(jq 'keys[]' ms.json)

फिर इसे प्रिंट करें:

printf "%s\n" ${arr[@]}

"Archiver-Version"
"Build-Id"
"Build-Jdk"
"Build-Number"
"Build-Tag"
"Built-By"
"Created-By"
"Implementation-Title"
"Implementation-Vendor-Id"
"Implementation-Version"
"Manifest-Version"
"appname"
"build-date"
"version"

धन्यवाद, यह काम किया! मैं शेल स्क्रिप्ट में सरणी = ($ keyContents) जैसे इन मूल्यों को असाइन कर रहा हूं, लेकिन इसके ठीक से काम नहीं कर रहा है, क्या किसी भी तरीके का उल्लेख करने के लिए डिलिमिटर्स का उल्लेख करना है?
एझीलन महालिंगम

जब भी कुंजी / मान में जगह होती है, तो सरणी इसे नए मान के रूप में मान रही है, मैंने रिक्त स्थान को _ से बदल दिया है जिसने समस्या को हल कर दिया है। आपका बहुत बहुत धन्यवाद! लेकिन अब एक और समस्या। : (मुझे अलग-अलग ऑर्डर मिल रहे हैं जब मुझे अकेले चाबी मिलती है और जब मुझे अकेले मूल्य मिलते हैं:
एझीलन महालिंगम

2
mapfile -t arr < <(jq -r 'keys[]' ms.json)कुंजी में रिक्त स्थान के साथ समस्या से बचने के लिए उस बदसूरत प्रक्रिया प्रतिस्थापन के बजाय का उपयोग करें ।
निकल्स होल्म

1
@anubhava, अगर मेफाइल अनुपलब्ध है तो एक अच्छा पुराना arr=(); while IFS='' read -r line; do arr+=("$line"); done < <(...)भी चलेगा।
निकोलस होल्म

2
keys_unsortedदस्तावेज़ क्रम में कुंजियाँ प्राप्त करने के लिए उल्लेख करना चाह सकते हैं ।
जेफ मर्काडो

30

आपको उपयोग करने की आवश्यकता है jq 'keys[]'। उदाहरण के लिए:

echo '{"example1" : 1, "example2" : 2, "example3" : 3}' | jq 'keys[]'

एक अलग लाइन सूची का उत्पादन करेगा:

"example1"
"example2"
"example3"

10

उपरोक्त उत्तर के संयोजन में, आप कच्चे आउटपुट के लिए jq पूछना चाहते हैं, इसलिए आपका अंतिम फ़िल्टर उदा होना चाहिए।

     cat input.json | jq -r 'keys'

जक मदद से:

     -r     output raw strings, not JSON texts;

यह एक पेचीदा bashस्क्रिप्ट गचा है - यदि आप निर्दिष्ट नहीं करते हैं -rतो आपको एक उद्धृत स्ट्रिंग मिलती है, जो स्क्रीन पर ठीक दिखती है, लेकिन आप आमतौर पर स्ट्रिंग में एम्बेडेड उद्धरण नहीं चाहते हैं।
MarkHu

4
बिल्ली का बेकार उपयोग
026 पर

5

सीएसवी के रूप में एक लाइन पर चाबियाँ प्रिंट करने के लिए:

echo '{"b":"2","a":"1"}' | jq -r 'keys | [ .[] | tostring ] | @csv'

आउटपुट:

"a","b"

सीएसवी पूर्णता के लिए ... सीएसवी के रूप में एक लाइन पर मान प्रिंट करने के लिए:

echo '{"b":"2","a":"1"}' | jq -rS . | jq -r '. | [ .[] | tostring ] | @csv'

आउटपुट:

"1","2"

4

echo '{"ab": 1, "cd": 2}' | jq -r 'keys[]' उद्धरण के बिना सभी कुंजी एक पंक्ति प्रति कुंजी प्रिंट करता है।

ab
cd


0

यहाँ उदाहरण के साथ बंस सरणी प्राप्त करने का एक और तरीका है जो उनके उत्तर में @anubhava द्वारा दिए गए JSON का है:

arr=($(jq --raw-output 'keys_unsorted | @sh' file.json))

echo ${arr[0]}    # 'Archiver-Version'
echo ${arr[1]}    # 'Build-Id'
echo ${arr[2]}    # 'Build-Jdk'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.