मैं jq का उपयोग करते हुए json दस्तावेज़ में एकल मान कैसे अपडेट करूं?


104

यदि मैंने कुछ स्पष्ट की अनदेखी की है, तो एप्लाइड; मैंने अभी पाया है jqऔर आसपास के डेटा को प्रभावित किए बिना एक JSON मान को अपडेट करने के लिए इसका उपयोग करने की कोशिश कर रहा हूं ।

मैं एक curlपरिणाम को पाइप करना चाहता हूं jq, एक मूल्य को अपडेट करता हूं , और अपडेट किए गए JSON को एक पाइप करता हूं curl -X PUT। कुछ इस तरह

curl http://example.com/shipping.json | jq '.' field: value | curl -X PUT http://example.com/shipping.json

अब तक मैंने इसे एक साथ उपयोग करके हैक कर लिया है sed, लेकिन |=ऑपरेटर के कुछ उदाहरणों को देखने के बाद jqमुझे यकीन है कि मुझे इनकी आवश्यकता नहीं है।

यहाँ एक JSON नमूना है - मैं JSON के बाकी हिस्सों को संरक्षित करते हुए कैसे jqसेट करूँगा "local": false?

{
  "shipping": {
    "local": true,
    "us": true,
    "us_rate": {
      "amount": "0.00",
      "currency": "USD",
      "symbol": "$"
    }
  }
}

जवाबों:


126

आप =ऑपरेटर का उपयोग करके किसी ऑब्जेक्ट का मान सेट करते हैं । |=दूसरी ओर एक मूल्य को अद्यतन करने के लिए उपयोग किया जाता है। यह एक सूक्ष्म लेकिन महत्वपूर्ण अंतर है। फ़िल्टर का संदर्भ बदलता है।

चूंकि आप किसी संपत्ति को निरंतर मूल्य पर सेट कर रहे हैं, =ऑपरेटर का उपयोग करें ।

.shipping.local = false

बस ध्यान दें कि किसी संपत्ति का मूल्य निर्धारित करते समय, यह आवश्यक रूप से मौजूद नहीं है। आप इस तरह से नए मान आसानी से जोड़ सकते हैं।

.shipping.local = false | .shipping.canada = false | .shipping.mexico = true

10
यह नमूना सामान्य मूल्य के लिए अच्छा नहीं है। इसलिए यदि आपको सामान्य मूल्य को बदलने की आवश्यकता है, तो आपको "इसके साथ जोड़ने की आवश्यकता है, जैसे कि .shipping.local = "new place"। तो पूरी आज्ञा होगी curl http://example.com/shipping.json | jq '.shipping.local = "new place"'। अन्यथा, आपको अजीब त्रुटियां मिलेंगी।
बीएमडब्ल्यू

8
@ बीएमडब्ल्यू क्या? यहां पूरी तरह से ठीक है। किसी भी वैध जसन मूल्य मान्य है, यह सिर्फ शाब्दिक होने के लिए होता है false। मानों को तार नहीं होना है।
जेफ मर्काडो

@ बीएमडब्ल्यू ओपी के साथ इसे स्थापित करना चाहता है false। क्या गलत है?
SOFe

17

एक मान अपडेट करें (सेट .foo.bar को "नया मान"):

jq '.foo.bar = "new value"' file.json

किसी वैरिएबल का उपयोग कर एक मान अपडेट करें (सेट .foo.bar से "hello"):

variable="hello"; jq --arg variable "$variable" '.foo.bar = $variable' file.json

मैंने इसे एक NPM पैकेज का नाम बदलने के लिए एक उदाहरण के रूप में इस्तेमाल किया था। शेल के माध्यम से इसे हटा दें और इसने 100% काम किया, धन्यवाद।
मचाडो

2
यह वास्तव में फ़ाइल की सामग्री को प्रतिस्थापित नहीं करता है। यह केवल स्टडआउट करने के लिए प्रिंट करता है। परिवर्तन को जारी रखने के लिए आपको फ़ाइल को वापस सहेजने की आवश्यकता होगी। देखें stackoverflow.com/a/60744617/1626687
21

1

ऑपरेटर के लिए एक समान कार्य | = मानचित्र है। नक्शा सरणी के लिए पिछले फ़िल्टर की आवश्यकता से बचने के लिए उपयुक्त होगा ...

कल्पना करें कि आपका डेटा एक सरणी है (इस उदाहरण के लिए बहुत सामान्य)

[
  {
    "shipping": {
      "local": true,
      "us": true,
      "us_rate": {
        "amount": "1.00",
        "currency": "USD",
        "symbol": "$"
      }
    }
  },
  {
    "shipping": {
      "local": true,
      "us": true,
      "us_rate": {
        "amount": "1.00",
        "currency": "USD",
        "symbol": "$"
      }
    }
  }
]

इसलिए कोड में सरणी पर विचार करना आवश्यक है:

http://example.com/shipping.json | jq '.[] | .shipping.local = "new place"' | curl -X PUT http://example.com/shipping.json

या मानचित्र फ़ंक्शन का उपयोग करने के लिए जिसे प्रत्येक सरणी तत्व में काम करने के लिए तैयार किया गया है

http://example.com/shipping.json | jq 'map(.shipping.local = "new place")' | curl -X PUT http://example.com/shipping.json

अवलोकन

जो लोग सीख रहे हैं, उनके लिए, आपने jq के उपयोग में कुछ गलतियाँ भी की हैं, बस विचार करें कि यह प्रोग्राम के रूप में 1 पैरामीटर को "रीड" करता है, इसलिए कॉल करने के बाद सभी वांछित कमांड्स को पहले स्ट्रिंग में शामिल किया जाएगा। कार्यक्रम।

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