jq से JSON ऑब्जेक्ट बदलना और बनाना
नए JSON पेलोड बनाने के लिए map, to_entries और ऑब्जेक्ट निर्माण का उपयोग करके डेटा का नया आकार दें।
jq से JSON ऑब्जेक्ट बदलना और बनाना, CoddyKit पर DevOps बूटकैंप का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह DevOps बूटकैंप सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। DevOps बूटकैंप पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
JSON को रूपांतरित क्यों करें?
API या लॉग फ़ाइलों से मिलने वाले कच्चे JSON का आकार शायद ही कभी आपकी आवश्यकता के बिल्कुल अनुरूप होता है। आपको कोई बड़ा ऑब्जेक्ट मिल सकता है, जबकि आपको केवल कुछ विशेष फ़ील्ड चाहिए हों; या आपको कुंजियों के नाम बदलने, नेस्ट की गई संरचनाओं को समतल करने या किसी दूसरी सेवा को भेजने के लिए पूरी तरह नया पेलोड बनाने की आवश्यकता हो सकती है।
jq एक हल्का और शक्तिशाली कमांड-लाइन JSON प्रोसेसर है, जो इन रूपांतरणों को एक ही पाइपलाइन में संभव बनाता है। इस पाठ में आप डेटा का आकार बदलने की तीन मुख्य तकनीकें सीखेंगे:
- ऑब्जेक्ट निर्माण — नए JSON ऑब्जेक्ट को शून्य से बनाना
- map — ऐरे के हर तत्व पर रूपांतरण लागू करना
- to_entries / from_entries — ऑब्जेक्ट की कुंजी-मूल्य जोड़ियों को ऐरे की तरह उपयोग करना, ताकि आप उन्हें फ़िल्टर करके फिर से बना सकें
सभी उदाहरणों में माना गया है कि jq इंस्टॉल है (apt install jq / brew install jq)।
ऑब्जेक्ट निर्माण की मूल बातें
jq की सबसे मूलभूत सुविधा ऑब्जेक्ट निर्माण है: नया JSON ऑब्जेक्ट बनाने के लिए अभिव्यक्तियों को {} में रखना। आप चुनते हैं कि कौन-से फ़ील्ड शामिल करने हैं और उन्हें क्या नाम देना है।
वाक्य-विन्यास:
{ newKey: .existingField }— किसी फ़ील्ड का नाम बदलना{ name, age }— जब नई कुंजी का नाम फ़ील्ड के नाम से मेल खाता हो, तब संक्षिप्त रूप{ total: (.price * .qty) }— मान की गणना वहीं करना
नीचे दिया गया अंश किसी उत्पाद के JSON को पढ़ता है और गणना किए गए subtotal फ़ील्ड के साथ अधिक संक्षिप्त संरचना तैयार करता है।
#!/usr/bin/env bash
# Object construction: pick and rename fields
product='{
"id": 42,
"name": "Widget Pro",
"price": 9.99,
"qty": 3,
"warehouse": "EU-West"
}'
echo "$product" | jq '{
productId: .id,
name,
subtotal: (.price * .qty)
}'नेस्ट किए गए डेटा से ऑब्जेक्ट बनाना
वास्तविक दुनिया का JSON अक्सर नेस्ट किया हुआ होता है। jq आपको ऑब्जेक्ट निर्माता के अंदर नेस्ट किए गए पथों तक पहुँचने देता है और उसी समय संरचना को समतल भी करता है।
निर्माता के मान वाली अभिव्यक्ति के अंदर डॉट-पथ नोटेशन का उपयोग करें:
{ city: .address.city }{ lat: .location.coords.lat }
नीचे दिया गया उदाहरण गहराई से नेस्ट किए गए उपयोगकर्ता रिकॉर्ड को लेता है और CSV हेडर पंक्ति या API अनुरोध के मुख्य भाग के लिए उपयुक्त समतल सारांश तैयार करता है।
#!/usr/bin/env bash
user='{
"id": "u-001",
"profile": {
"displayName": "Ada Lovelace",
"contact": { "email": "ada@example.com", "phone": "+44-700" }
},
"plan": "pro"
}'
echo "$user" | jq '{
id,
name: .profile.displayName,
email: .profile.contact.email,
plan
}'map से ऐरे रूपांतरित करना
map(expr) jq में हर तत्व के लिए के समतुल्य है: यह इनपुट ऐरे के हर तत्व पर expr लागू करता है और उसी लंबाई का नया ऐरे लौटाता है।
मुख्य बातें:
map(expr),[.[] | expr]का संक्षिप्त रूप है- इसके अंदर की अभिव्यक्ति कोई भी jq फ़िल्टर हो सकती है — ऑब्जेक्ट निर्माण भी
- रूपांतरण से पहले फ़िल्टर करने के लिए इसे
select()के साथ जोड़ें
यह अंश ऑर्डर की सूची को संसाधित करता है और शिपिंग सूची के लिए आवश्यक फ़ील्ड ही रखता है।
#!/usr/bin/env bash
orders='[
{"orderId": 1, "customer": "Alice", "total": 42.50, "status": "shipped"},
{"orderId": 2, "customer": "Bob", "total": 18.00, "status": "pending"},
{"orderId": 3, "customer": "Carol", "total": 99.99, "status": "shipped"}
]'
# Produce a shipping manifest: only shipped orders, slim fields
echo "$orders" | jq '[
.[] | select(.status == "shipped") | {
id: .orderId,
recipient: .customer,
amount: .total
}
]'गणना किए गए फ़ील्ड के साथ map
map के अंदर आप केवल फ़ील्ड की प्रतिलिपि ही नहीं बना सकते, बल्कि नए मानों की गणना, प्रकारों का रूपांतरण और फ़ील्ड का संयोजन भी कर सकते हैं। सामान्य प्रतिरूपों में शामिल हैं:
- स्ट्रिंग इंटरपोलेशन:
"\(.first) \(.last)" - अंकगणित: 20% बढ़ोतरी के लिए
(.price * 1.2 | round) - शर्तीय अभिव्यक्ति:
if .score >= 90 then "A" else "B" end
नीचे दिया गया उदाहरण कर्मचारियों की सूची में अनुभव के वर्षों के आधार पर गणना किया गया fullName और seniority लेबल जोड़ता है।
#!/usr/bin/env bash
staff='[
{"first": "Grace", "last": "Hopper", "years": 15},
{"first": "Alan", "last": "Turing", "years": 4},
{"first": "Linus", "last": "Torvalds","years": 9}
]'
echo "$staff" | jq 'map({
fullName: "\(.first) \(.last)",
years,
seniority: (if .years >= 10 then "senior" elif .years >= 5 then "mid" else "junior" end)
})'to_entries को समझना
to_entries JSON ऑब्जेक्ट को {key, value} जोड़ियों के ऐरे में बदलता है। इससे ऑब्जेक्ट के फ़ील्ड पर ऐरे की कार्रवाइयाँ (map, select, sort) की जा सकती हैं — ऐसा काम जिसे सीधे ऑब्जेक्ट पर नहीं किया जा सकता।
रूपांतरण का उदाहरण:
- इनपुट:
{"a": 1, "b": 2} - आउटपुट:
[{"key": "a", "value": 1}, {"key": "b", "value": 2}]
उलटा ऑपरेशन from_entries है, जो उस ऐरे को फिर से ऑब्जेक्ट में बदल देता है। दोनों मिलकर ऑब्जेक्ट-स्तरीय रूपांतरण के लिए to_entries | map(...) | from_entries प्रतिरूप बनाते हैं।
#!/usr/bin/env bash
# Demonstrate to_entries and from_entries
config='{"host": "db.local", "port": 5432, "ssl": true}'
echo "--- to_entries output ---"
echo "$config" | jq 'to_entries'
echo "--- round-trip back to object ---"
echo "$config" | jq 'to_entries | from_entries'to_entries से कुंजियाँ फ़िल्टर करना
to_entries के सबसे उपयोगी प्रयोगों में से एक है कुंजी के नाम के आधार पर यह तय करना कि कौन-सी कुंजियाँ रखनी या हटानी हैं — ऐसा काम ऑब्जेक्ट निर्माण से नहीं किया जा सकता, जब कुंजियों के नाम पहले से ज्ञात न हों।
प्रतिरूप:
to_entries | map(select(.key | test("regex"))) | from_entriesto_entries | map(select(.key != "secret")) | from_entries
नीचे दिया गया अंश अंडरस्कोर से शुरू होने वाली सभी कुंजियों (आंतरिक/निजी फ़ील्ड) को हटाकर कॉन्फ़िगरेशन ऑब्जेक्ट को बाहरी सेवा को भेजता है।
#!/usr/bin/env bash
raw_config='{
"endpoint": "https://api.example.com",
"timeout": 30,
"_internalToken": "s3cr3t",
"_debugMode": true,
"retries": 3
}'
# Remove any key starting with underscore
echo "$raw_config" | jq '
to_entries
| map(select(.key | startswith("_") | not))
| from_entries
'to_entries से कुंजियों के नाम गतिशील रूप से बदलना
ऑब्जेक्ट निर्माण लिखते समय ज्ञात कुंजियों के नाम बदलता है। to_entries आपको कुंजियों के नाम प्रोग्राम के माध्यम से बदलने देता है — उदाहरण के लिए camelCase को snake_case में बदलना या कोई उपसर्ग जोड़ना।
map के अंदर आप हर प्रविष्टि के .key फ़ील्ड को अपडेट करते हैं और फिर उसे from_entries में पाइप करते हैं:
map(.key |= gsub("(?<=[a-z])(?=[A-Z])"; "_") | .key |= ascii_downcase)— camelCase से snake_casemap(.key |= "app_" + .)— हर कुंजी में उपसर्ग जोड़ना
यह उदाहरण सभी पर्यावरण वैरिएबल नामों में APP_ उपसर्ग जोड़ता है, ताकि उन्हें कंटेनर में सम्मिलित करने से पहले एक अलग नाम-क्षेत्र मिल सके।
#!/usr/bin/env bash
env_vars='{"host": "localhost", "port": "8080", "debug": "false"}'
# Add APP_ prefix and uppercase all keys
echo "$env_vars" | jq '
to_entries
| map({ key: ("APP_" + (.key | ascii_upcase)), value })
| from_entries
'with_entries: सुविधाजनक संक्षिप्त रूप
to_entries | map(...) | from_entries प्रतिरूप इतना सामान्य है कि jq इसका संक्षिप्त रूप with_entries(expr) उपलब्ध कराता है।
यह बिल्कुल समान है, लेकिन अधिक संक्षिप्त:
with_entries(.value |= . * 2)— हर संख्यात्मक मान को दोगुना करनाwith_entries(select(.value != null))— null मान वाली कुंजियों को हटानाwith_entries(.key |= ascii_upcase)— सभी कुंजियों को बड़े अक्षरों में बदलना
यह अंश उन सभी कुंजियों को हटा देता है जिनका मान null या खाली स्ट्रिंग है — REST API को PATCH अनुरोध भेजने से पहले किया जाने वाला सामान्य सफ़ाई चरण।
#!/usr/bin/env bash
patch_body='{
"name": "Mehmet",
"email": "",
"phone": null,
"city": "Istanbul"
}'
# Drop empty/null fields before PATCH
cleaned=$(echo "$patch_body" | jq '
with_entries(select(.value != null and .value != ""))
')
echo "Cleaned payload:"
echo "$cleaned"
# In practice you would pipe to curl:
# curl -s -X PATCH https://api.example.com/users/1 \
# -H "Content-Type: application/json" \
# -d "$cleaned"पाइपलाइन में map और ऑब्जेक्ट निर्माण को जोड़ना
वास्तविक रूपांतरणों में कई jq ऑपरेशन एक साथ जोड़े जाते हैं। API पेलोड तैयार करने वाली सामान्य पाइपलाइन में ये काम हो सकते हैं:
map(select(...))से इनपुट ऐरे को फ़िल्टर करना- ऑब्जेक्ट निर्माण से हर तत्व का आकार बदलना
- गणना किए गए फ़ील्ड जोड़ना
- परिणाम को क्रमबद्ध करना
नीचे दिया गया उदाहरण सर्वर मेट्रिक्स की सूची पढ़ता है, अधिक CPU उपयोग वाले सर्वर ही रखता है और वेबहुक को POST करने के लिए तैयार संक्षिप्त चेतावनी पेलोड बनाता है।
#!/usr/bin/env bash
metrics='[
{"host": "web-01", "cpu": 23, "mem": 60, "region": "eu"},
{"host": "web-02", "cpu": 91, "mem": 88, "region": "eu"},
{"host": "db-01", "cpu": 78, "mem": 95, "region": "us"},
{"host": "db-02", "cpu": 12, "mem": 40, "region": "us"}
]'
alerts=$(echo "$metrics" | jq '[
.[] | select(.cpu > 75 or .mem > 85) | {
server: .host,
region,
severity: (if .cpu > 90 or .mem > 90 then "critical" else "warning" end),
metrics: { cpu: .cpu, mem: .mem }
}
] | sort_by(.severity)')
echo "$alerts"कई स्रोतों से नया JSON ऑब्जेक्ट बनाना
jq जोड़ ऑपरेटर + और as $var के साथ वैरिएबल बाँधने का उपयोग करके इनपुट को मिला सकता है और कई JSON स्रोतों से डेटा लेकर ऑब्जेक्ट बना सकता है।
उपयोगी प्रतिरूप:
obj1 + obj2— दो ऑब्जेक्ट मिलाना (कुंजी के टकराव पर दाईं ओर का मान प्रभावी होता है)--argjson— दूसरे JSON दस्तावेज़ को वैरिएबल के रूप में देना$ENV— jq के अंदर सीधे पर्यावरण वैरिएबल पढ़ना
यह अंश मूल कॉन्फ़िगरेशन को पर्यावरण-विशिष्ट ओवरराइड के साथ मिलाता है — शेल स्क्रिप्ट में 12-factor एप्लिकेशन कॉन्फ़िगरेशन प्रबंधन का सामान्य प्रतिरूप।
#!/usr/bin/env bash
base_config='{
"logLevel": "info",
"timeout": 30,
"retries": 3,
"database": "postgres://db.local/app"
}'
env_overrides='{
"logLevel": "debug",
"database": "postgres://db.staging/app_staging"
}'
# Merge: overrides win on conflicts
merged=$(echo "$base_config" | jq --argjson overrides "$env_overrides" '. + $overrides')
echo "Merged config:"
echo "$merged"ज्ञान जाँच: to_entries बनाम map
आपके पास निम्नलिखित JSON ऑब्जेक्ट है और आपको उन सभी कुंजियों को हटाना है जिनका मान 0 से कम है, ताकि केवल गैर-ऋणात्मक मानों वाला नया ऑब्जेक्ट बने। इसे सही ढंग से करने वाली jq अभिव्यक्ति कौन-सी है?
इनपुट: {"a": 10, "b": -3, "c": 0, "d": 5}
पाठ का पुनरावलोकन: jq से JSON रूपांतरित करना
आपने jq से JSON का आकार बदलने की आवश्यक तकनीकों का अध्ययन किया है:
- ऑब्जेक्ट निर्माण
{}— इनपुट से फ़ील्ड चुनकर, उनके नाम बदलकर और उनकी गणना करके नए ऑब्जेक्ट बनाना map(expr)— ऐरे के हर तत्व पर कोई भी रूपांतरण लागू करना, जिसमें नेस्टेड ऑब्जेक्ट निर्माण और फ़िल्टर करने के लिएselect()भी शामिल हैंto_entries/from_entries— ऑब्जेक्ट को{key, value}जोड़ियों के ऐरे में बदलना, जिससे कुंजियों और मानों पर ऐरे की कार्रवाइयाँ की जा सकें, और फिर उसे वापस ऑब्जेक्ट में बदलनाwith_entries(expr)— पूरे to_entries → map → from_entries पाइपलाइन का संक्षिप्त रूप+और--argjsonसे कई स्रोतों वाले पेलोड के लिए ऑब्जेक्ट मिलाना
इन आधारभूत तत्वों को एक साथ जोड़ा जा सकता है: select से फ़िल्टर करें, ऑब्जेक्ट निर्माण से आकार बदलें, गणना किए गए फ़ील्ड से जानकारी बढ़ाएँ और इसे एक ही पठनीय jq अभिव्यक्ति में क्रम से चलाएँ। इन प्रतिरूपों में दक्ष होने पर आप Python या Node में अलग स्क्रिप्ट लिखे बिना, सीधे शेल में लगभग किसी भी JSON पेलोड को व्यवस्थित कर सकते हैं।
एआई शिक्षक के साथ DevOps बूटकैंप सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 142
- पाठ
- 568
अक्सर पूछे जाने वाले प्रश्न
क्या “jq से JSON ऑब्जेक्ट बदलना और बनाना” पाठ निःशुल्क है?
हाँ — DevOps बूटकैंप अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “jq से JSON ऑब्जेक्ट बदलना और बनाना” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। DevOps बूटकैंप पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“jq से JSON ऑब्जेक्ट बदलना और बनाना” में मैं क्या सीखूँगा?
नए JSON पेलोड बनाने के लिए map, to_entries और ऑब्जेक्ट निर्माण का उपयोग करके डेटा का नया आकार दें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ DevOps बूटकैंप का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या DevOps बूटकैंप शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर DevOps बूटकैंप शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“jq से JSON ऑब्जेक्ट बदलना और बनाना” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस DevOps बूटकैंप पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर DevOps बूटकैंप पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- jq पाइपलाइनों से JSON फ़िल्टर और चयन
- jq से JSON ऑब्जेक्ट बदलना और बनाना
- curl और jq से REST API का उपयोग
- yq से YAML कॉन्फ़िगरेशन फ़ाइलों का संपादन