JSON ऑब्जेक्ट, दूसरी भाषाओं की शब्दावली में कहें तो, एक "हैश", "मैप" या "डिक्शनरी" है।
JSON ऑब्जेक्ट को इस तरह परिभाषित करता है:
ऑब्जेक्ट नाम/वैल्यू जोड़ों का एक समुच्चय है जिसका कोई निश्चित क्रम नहीं होता। ऑब्जेक्ट
{बाएँ ब्रेस से शुरू होता है और}दाएँ ब्रेस पर खत्म होता है। हर नाम के बाद:कोलन आता है और नाम/वैल्यू जोड़ों को,कॉमा से अलग किया जाता है।
नाम एक स्ट्रिंग ही होना चाहिए। नाम का दूसरा शब्द की है।
वैल्यू किसी भी JSON टाइप की हो सकती है। एक ही ऑब्जेक्ट में अलग-अलग वैल्यू अलग-अलग टाइप की हो सकती हैं, जैसे इस उदाहरण में।
{
"name": "Jane",
"age": 42,
"pets": ["cat", "fish"],
"address": {"street": "123 Main St", "city": "Springfield"}
}
ध्यान रखिए कि अंतिम की-वैल्यू जोड़े के बाद कोई कॉमा नहीं होना चाहिए।
नाम/वैल्यू जोड़ों को इकट्ठा करने के लिए ब्रेस का उपयोग कीजिए। हालाँकि नाम स्ट्रिंग ही होने चाहिए, लेकिन अगर नाम आइडेंटिफायर जैसे हों (अल्फान्यूमेरिक अक्षरों और अंडरस्कोर से बने हों, और किसी अंक से शुरू न हों) तो उन्हें कोट में लिखने की ज़रूरत नहीं है।
{name: "Jane", age: 42}
ऐसी की का उपयोग करना भी मान्य है जो आइडेंटिफायर जैसी न हों। बस उन्हें कोट में लिख दीजिए।
{"first name": "Jane", "last name": "Lopez", age: 42}
अगर नाम किसी एक्सप्रेशन का परिणाम है, तो एक्सप्रेशन अवश्य कोष्ठकों में होना चाहिए।
$ echo "Jane" | jq -Rc '{.: 42}'
# verbose error message ...
$ echo "Jane" | jq -Rc '{(.): 42}'
{"Jane":42}
ऑब्जेक्ट से वैल्यू डॉट नोटेशन से निकाली जाती हैं।
{name: "Jane", age: 42} | .age # => 42
अगर आप की को किसी आइडेंटिफायर की तरह नहीं लिख सकते, तो ब्रैकेट नोटेशन का उपयोग कीजिए।
"name" as $key | {name: "Jane", age: 42} | .$key # => error
"name" as $key | {name: "Jane", age: 42} | .[$key] # => "Jane"
किसी ऐरे में नया की-वैल्यू जोड़ा जोड़ने के लिए, या किसी मौजूदा की की वैल्यू बदलने के लिए, = असाइनमेंट ऑपरेटर का उपयोग कीजिए, जिसके बाईं ओर एक इंडेक्स एक्सप्रेशन हो।
{name: "Jane", age: 42} | .sport = "tennis" | .age = 21
# => {
# "name": "Jane",
# "age": 21,
# "sport": "tennis"
# }
+ ऑपरेटर ऑब्जेक्ट को मर्ज करता है।
{Richard: 54} + {Jane: 42}
# => {
# "Richard": 54,
# "Jane": 42
# }
किसी की को हटाने के लिए del फंक्शन का उपयोग कीजिए।
यह अपडेट किया गया ऑब्जेक्ट लौटाता है।
{name: "Jane", age: 42} | del(.age) # => {"name": "Jane"}
del को दिया जाने वाला पैरामीटर एक इंडेक्स एक्सप्रेशन होता है (जो डॉट या ब्रैकेट नोटेशन का उपयोग करता है), जो ऑब्जेक्ट में किसी की पर लागू होता है।
jq इसे पाथ एक्सप्रेशन कहता है।
सिर्फ एक स्ट्रिंग देना काफी नहीं है।
{name: "Jane", age: 42} | del(name) # error: name/0 is not defined
{name: "Jane", age: 42} | del("name") # error: Invalid path expression with result "name"
{name: "Jane", age: 42} | del(.name) # OK
{name: "Jane", age: 42} | del(.["name"]) # OK
यह जाँचने के लिए कि ऑब्जेक्ट में कोई की है या नहीं, has फंक्शन का उपयोग कीजिए।
{name: "Jane", age: 42} as $example
|
($example | has("name")), # => true
($example | has("sport")) # => false
in से जाँचिए कि कोई की ऑब्जेक्ट में है या नहीं।
{name: "Jane", age: 42} as $example
|
("name" | in($example)), # => true
("sport" | in($example)) # => false
सभी की की सूची देने के लिए keys फंक्शन का उपयोग कीजिए।
{name: "Jane", age: 42} | keys # => ["age", "name"]
ध्यान दीजिए कि keys फंक्शन की को सॉर्ट कर देता है।
की को मूल क्रम में पाने के लिए keys_unsorted का उपयोग कीजिए।
सभी वैल्यू को सूचीबद्ध करने वाला कोई समान फंक्शन नहीं है।
लेकिन .[] फिल्टर ऑब्जेक्ट की वैल्यू को एक स्ट्रीम के रूप में देता है, और उस स्ट्रीम को [...] ऐरे कंस्ट्रक्टर से पकड़ा जा सकता है।
[{first: "Jane", last: "Lopez", status: "awesome!"} | .[]]
# => ["Jane", "Lopez", "awesome!"]
map_values(filter) फंक्शन ऑब्जेक्ट की हर वैल्यू पर फिल्टर लागू करता है।
{first: "Jane", last: "Lopez", status: "awesome!"}
| map_values(ascii_upcase)
# => {"first": "JANE", "last": "LOPEZ", "status": "AWESOME!"}
किसी ऑब्जेक्ट पर इटरेशन करने के लिए, हमें पहले उसे की-वैल्यू ऑब्जेक्ट के ऐरे में बदलना होगा।
to_entries फंक्शन यही करता है।
{name: "Jane", age: 42} | to_entries'
# => [
# {
# "key": "name",
# "value": "Jane"
# },
# {
# "key": "age",
# "value": 42
# }
# ]
अब हम ऐरे पर इटरेशन करने वाले फंक्शन, जैसे map, उपयोग कर सकते हैं।
from_entries फंक्शन इसका उल्टा है: की-वैल्यू ऑब्जेक्ट के ऐरे को ऑब्जेक्ट में बदलना।
[
{"key":"name", "value":"Jane"},
{"key":"age", "value":42}
] | from_entries # =>{"name": "Jane", "age": 42}
ऑब्जेक्ट में हर की-वैल्यू जोड़े पर फिल्टर लागू करने के लिए, with_entries(filter) फंक्शन का उपयोग कीजिए।
उदाहरण के लिए, मान लीजिए एक ऑब्जेक्ट है जो नाम को उम्र से जोड़ता है, तो की और वैल्यू को इस तरह आपस में बदला जा सकता है।
{"Jane": 42, "Richard": 54}
| with_entries({key: (.value | tostring), value: .key})
इसका आउटपुट है
{
"42": "Jane",
"54": "Richard"
}
with_entries(filter) वही है जो
to_entries | map(filter) | from_entries
इस अभ्यास में आप अपने स्थानीय आर्केड हॉल के सबसे लोकप्रिय खेल के हाई स्कोर पर ध्यान रखने का तरीका बना रहे हैं।
आपको 6 फंक्शन बनाने हैं, जिनमें से ज़्यादातर एक ऐसे ऑब्जेक्ट को बदलने से जुड़े हैं जिसमें हाई स्कोर रखे जाते हैं।
एक फंक्शन create_score_board लिखिए जो एक ऑब्जेक्ट बनाता है जो हाई स्कोर बोर्ड का काम करता है।
इस ऑब्जेक्ट की कीज़ खिलाड़ियों के नाम होंगी और इनकी वैल्यू उनके स्कोर होंगी।
जाँच के उद्देश्य से आप इस ऑब्जेक्ट में सीधे एक एंट्री शामिल करना चाहते हैं।
इस शुरुआती एंट्री में खिलाड़ी के नाम के रूप में "The Best Ever" और स्कोर के रूप में 1000000 होना चाहिए।
create_score_board
# returns an object with one initial entry
हाई स्कोर बोर्ड में एक खिलाड़ी जोड़ने के लिए add_player फंक्शन बनाइए।
यह इनपुट के रूप में एक स्कोर बोर्ड लेता है और इसे दो पैरामीटर चाहिए: खिलाड़ी का नाम और उसका स्कोर।
यह फंक्शन नए खिलाड़ी को जोड़कर स्कोर बोर्ड ऑब्जेक्ट लौटाता है।
{"José Valim", 486373}
| add_player("Dave Thomas"; 0)
# => {"Dave Thomas": 0, "José Valim": 486373} -- in some order
अगर खिलाड़ी पहले से बोर्ड पर मौजूद है, तो बोर्ड को बिना बदले ही लौटाइए।
अगर खिलाड़ी आर्केड हॉल के नियम तोड़ते हैं, तो उन्हें हाई स्कोर बोर्ड से हाथ से हटा दिया जाता है।
remove_player बनाइए, जो इनपुट के रूप में एक बोर्ड और एक पैरामीटर लेता है: उस खिलाड़ी का नाम जिसे हटाना है।
इस फंक्शन को बोर्ड से दिए गए खिलाड़ी की एंट्री हटाकर नया बोर्ड लौटाना चाहिए।
अगर खिलाड़ी शुरू से ही बोर्ड पर नहीं था, तो बोर्ड पर कोई बदलाव नहीं होना चाहिए; बोर्ड जैसा है वैसा ही लौटाया जाना चाहिए।
{"Dave Thomas": 0} | remove_player("Dave Thomas")
# => {}
{"Dave Thomas": 0} | remove_player("Rose Fanaras")
# => {"Dave Thomas": 0}
अगर कोई खिलाड़ी आर्केड हॉल में कोई और गेम पूरा करता है, तो बोर्ड पर उसके पिछले स्कोर में कुछ अंक जोड़ दिए जाते हैं।
update_score बनाइए, जो इनपुट के रूप में एक स्कोर बोर्ड लेता है और इसे दो पैरामीटर चाहिए: खिलाड़ी का नाम और जोड़ने वाले स्कोर की मात्रा।
अपडेट हो जाने के बाद इस फंक्शन को स्कोर बोर्ड लौटाना चाहिए।
{"Freyja Ćirić": 12771000} | update_score("Freyja Ćirić"; 73)
# => {"Freyja Ćirić": 12771073}
अगर खिलाड़ी पहले से बोर्ड पर नहीं है, तो इस फंक्शन को उसे बोर्ड में जोड़ देना चाहिए।
आर्केड हॉल सोमवार को एक अलग स्कोर बोर्ड रखता है। दिन के अंत में उस बोर्ड पर मौजूद हर खिलाड़ी को 100 अतिरिक्त अंक मिलते हैं।
apply_monday_bonus फंक्शन बनाइए।
यह फंक्शन उस बोर्ड पर दर्ज हर खिलाड़ी के लिए बोनस अंक जोड़ता है।
{
"Dave Thomas": 44,
"Freyja Ćirić": 539,
"José Valim": 265
}
| apply_monday_bonus
# => {"Dave Thomas": 144, "Freyja Ćirić": 639, "José Valim": 365}
अलग-अलग आर्केड हॉल आपस में मुकाबला करते हैं, ताकि यह तय हो कि किसके खिलाड़ी सबसे अच्छे हैं। सबसे ज़्यादा कुल स्कोर वाले आर्केड हॉल को यह सम्मान मिलता है।
total_score नाम का फंक्शन लिखिए।
यह इनपुट के रूप में एक स्कोर बोर्ड लेता है और सभी खिलाड़ियों के स्कोर का जोड़ लौटाता है।
{
"Dave Thomas": 44,
"Freyja Ćirić": 539,
"José Valim": 265
}
| total_score
# => 848
Exercism पर साइन अप कीजिए और jq को 12 कॉन्सेप्ट75 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।