JSON स्ट्रिंग को पार्स करने के लिए jq का उपयोग करें


87

मैं jqएक JSON संरचना को पार्स करने की कोशिश कर रहा हूं जैसे:

{
  "a" : 1,
  "b" : 2,
  "c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}

यही है, JSON में एक तत्व एक भाग है जिसमें बचा हुआ जसन है।

तो, मैं कुछ की तर्ज पर है $ jq [.c] myFile.json | jq [.id]

लेकिन इससे दुर्घटना होती है jq: error: Cannot index string with string

ऐसा इसलिए है क्योंकि .c का आउटपुट एक स्ट्रिंग है, JSON अधिक नहीं। इस स्ट्रिंग को पार्स करने के लिए मुझे jq कैसे मिलेगा?

मेरा प्रारंभिक समाधान सभी एस्केप वर्ण ( और ) को बदलने के लिए sed का उपयोग करना है \":\", लेकिन यह गड़बड़ है, मुझे लगता है कि ऐसा करने के लिए एक तरीका बनाया गया है?\",\"\"jq

धन्यवाद!

संपादित करें: इसके अलावा, यहाँ उपलब्ध jq संस्करण है:

$ jq --version
jq version 1.3

मुझे लगता है कि आवश्यकता होने पर मैं इसे अपडेट कर सकता था।


यह सवाल भी मदद करता है कि आप क्या देख रहे हैं: "कैसे jq का उपयोग करके स्ट्रिंग को अनसेक करें?"
k0pernikus

जवाबों:


164

jq में इसके लिए बिलिन है fromjson:

jq '.c | fromjson | .id' myFile.json

fromjson संस्करण 1.4 में जोड़ा गया था।


2
धन्यवाद। यह काम। मैं इस उत्तर को स्वीकार करूंगा, क्योंकि यह अधिक 'आइडियोओमीटिक' है। चीयर्स।
कॉलिन ग्रोगन

@ColinGrogan कृपया करते हैं।
vbence

@ColinGrogan: आपके द्वारा अपने प्रश्न में स्पष्ट रूप से लिखे जाने के बाद से मुझे स्वीकार किए गए उत्तर को बदलने का कोई कारण नहीं दिखता है, आपने jq के संस्करण 1.3 का उपयोग किया है जिसमें यह fromjsonसुविधा उपलब्ध नहीं है। दूसरे शब्दों में, भले ही यह जवाब दिलचस्प हो, यह सवाल का जवाब नहीं देता है।
कासिमिर एट हिप्पोलाईट

क्या इसका उपयोग करना संभव है लेकिन संपूर्ण json फ़ाइल पर (.id संपत्ति निर्दिष्ट नहीं)?
फ्लोरिअन क्लेयन

1
@FlorianCastelain हाँ, या तो इसे छोड़ दें या डॉट का उपयोग करें:, jq 'fromjson | .' myfileजहाँ myfile शामिल है"{\"key\":1, \"word\":\"cat\"}"

41

आप कच्चे आउटपुट (-r) का उपयोग कर सकते हैं जो वर्णों को अनसेक करेगा:

jq -r .c myfile.json | jq .id

ADDENDUM: इसका यह फायदा है कि यह 1.3 और jq में काम करता है; वास्तव में, इसे jr के हर संस्करण में काम करना चाहिए जिसमें -r विकल्प है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.