JSONPath JSON के लिए एक क्वेरी भाषा है, जैसे XPath XML के लिए है। इसे 2007 में Stefan Goessner ने खींचा था, जिसे हर किसी ने जिसे इसकी आवश्यकता थी अलग-अलग लागू किया, और अंततः 2024 में RFC 9535 के रूप में मानकीकृत किया गया। वह इतिहास इसलिए है कि दो JSONPath कार्यान्वयन अक्सर असहमत होते हैं, और इसलिए कि एक चीट शीट परिणामों के साथ एक प्रतीकों की सूची से अधिक उपयोगी है।
नीचे हर क्वेरी इस दस्तावेज़ के खिलाफ चलती है। आप इसे JSONPath टेस्टर में पेस्ट कर सकते हैं, जो इसे ठीक अपने नमूने के रूप में लोड करता है।
{
"store": {
"book": [
{ "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 },
{ "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 },
{ "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }
],
"bicycle": { "color": "red", "price": 19.95 }
},
"expensive": 10
}
चयनक
रूट। $ पूरा दस्तावेज़ है। हर क्वेरी वहीं से शुरू होती है।
नाम से चाइल्ड। $.store.bicycle.color "red" लौटाता है। एक डॉट फिर नाम,
जितनी बार चाहें।
कोटेड नाम। $['store']['bicycle'] वही चीज़ है जो दूसरे तरीके से लिखी गई है।
आपको ब्रैकेट की आवश्यकता होती है जब किसी कुंजी में स्पेस, डॉट या डैश हो,
या जब वह किसी अंक से शुरू होती है: $['first name']।
वाइल्डकार्ड। $.store.bicycle.* "red" और 19.95 लौटाता है, उस ऑब्जेक्ट के
हर चाइल्ड को। $.store.book[*] तीनों किताबें लौटाता है।
इंडेक्स। $.store.book[0] पहली किताब है। $.store.book[-1] आखिरी
है, अंत से वापस गिनते हुए।
स्लाइस। $.store.book[0:2] पहली दो किताबें लौटाता है। अंत
एक्सक्लूसिव है, ठीक Python की तरह। $.store.book[::2] हर दूसरी किताब लेता है,
और नकारात्मक कदम उलट देता है: $.store.book[::-1]।
यूनियन। $.store.book[0, 2] पहली और तीसरी किताबें लौटाता है।
$.store.bicycle['color', 'price'] दो नामित चाइल्ड्स का एक साथ चयन करता है।
डिसेंडेंट। $..price किसी भी गहराई में हर मूल्य लौटाता है, जो यहाँ
8.95, 12.99, 8.99 और 19.95 है। यह वह चयनक है जिसकी ओर लोग सबसे अधिक
रुख करते हैं और जो एक बड़े दस्तावेज़ पर सबसे अधिक खर्च करता है, क्योंकि यह हर
मान पर जाता है।
फ़िल्टर। $.store.book[?@.price < 10] दो सस्ती किताबें लौटाता है। @
परीक्षण किए जा रहे मान को संदर्भित करता है। RFC 9535 ने पुराने ट्यूटोरियल में उपयोग किए जाने वाले
पैरेंथेसिस को हटा दिया है, इसलिए [?@.price < 10] और [?(@.price < 10)] दोनों
प्रचलन में दिखाई देते हैं। यहाँ का टेस्टर दोनों को स्वीकार करता है।
अस्तित्व। $.store.book[?@.isbn] केवल वह किताब लौटाता है जिसके पास isbn
फ़ील्ड है, बिना इसे किसी से तुलना किए।
परीक्षणों को संयोजित करना। &&, || और ! जैसा आप अपेक्षा करते हैं वैसे काम करते हैं:
$..book[?@.category == 'fiction' && @.price < 10].title "Moby Dick" लौटाता है।
एक फ़िल्टर जो सही दिखता है वह कुछ क्यों नहीं लौटाता
लगभग हमेशा, यह एक प्रकार का मेल न होना है। विनिर्देश कहता है कि अलग-अलग
प्रकारों के मान कभी बराबर नहीं होते और कभी क्रमबद्ध नहीं होते, इसलिए कोटेड "8.95" में संग्रहीत मूल्य
@.price < 10 से मेल नहीं खाता, और यह @.price == 8.95 से भी मेल नहीं खाता।
यदि कोई फ़िल्टर कुछ नहीं लौटाता, तो क्वेरी जाँचने से पहले दस्तावेज़ में प्रकारों की जाँच करें।
दूसरा कारण फ़िल्टर को गलत स्तर से जोड़ना है। एक फ़िल्टर उस मान के चाइल्ड्स में से चयन करता है
जिससे वह जुड़ा होता है, इसलिए यह एरे के बाद आता है:
book[?@.price < 10], book.price[?...] नहीं। एक ऑब्जेक्ट से जुड़ा होने पर, यह उस
ऑब्जेक्ट के हर प्रॉपर्टी मान का परीक्षण करता है।
तीसरा, अनुपस्थित मान null नहीं है। @.isbn == null एक ऐसी किताब से मेल खाता है जिसका
isbn शाब्दिक रूप से null है, न कि एक ऐसी किताब से जिसके पास बिल्कुल भी isbn नहीं है।
अनुपस्थिति का परीक्षण करने के लिए, !@.isbn लिखें।
कार्यान्वयन कहाँ असहमत होते हैं
2007 का लेख एक प्रस्ताव था, विनिर्देश नहीं, इसलिए लाइब्रेरीज़ सत्रह वर्षों तक भिन्न होती रहीं। यदि आप एक क्वेरी को उपकरणों के बीच स्थानांतरित कर रहे हैं, तो ये वे स्थान हैं जिनकी जाँच करनी है:
- नकारात्मक इंडेक्स और नकारात्मक कदम अब व्यापक रूप से समर्थित हैं और कुछ पुरानी लाइब्रेरीज़ में अनुपस्थित हैं।
- पैरेंथेसिस वाली फ़िल्टर फ़ॉर्म पुरानी वर्तनी है। RFC 9535 नंगे
[?...]का उपयोग करती है, और बहुत सारे उपकरण केवल एक को स्वीकार करते हैं। - RFC
length(),count(),match()औरsearch()फ़ंक्शन परिभाषित करती है। कई कार्यान्वयन या तो इनकी कमी हैं या अलग नामों के तहत एक अलग सेट प्रदान करते हैं। - RFC परिणामों को दस्तावेज़ क्रम देती है। कुछ कार्यान्वयन इसकी गारंटी नहीं देते, विशेष रूप से डिसेंडेंट सेगमेंट के लिए।
इस साइट का टेस्टर ऊपर सूचीबद्ध चयनकों को लागू करता है और पेज पर स्पष्ट रूप से कहता है, जिसमें यह क्या समर्थित है इसकी एक तालिका शामिल है। फ़ंक्शन एक्सटेंशन, फ़िल्टर के अंदर एब्सोल्यूट पथ, और दो पथों की तुलना करना कार्यान्वित नहीं है, और इनमें से किसी का उपयोग करने पर वाक्यविन्यास त्रुटि के बजाय सुविधा का नाम देने वाला संदेश उत्पन्न होता है। यह एक जानबूझकर किया गया विकल्प है: एक उपकरण जो पूर्ण अनुपालन का दावा करता है और फिर किसी एज केस पर चुपचाप विफल हो जाता है वह एक ऐसे उपकरण से बदतर है जो आपको बताता है कि उसकी सीमा कहाँ है।
JSONPath या JSON Pointer
वे अलग-अलग प्रश्नों का उत्तर देते हैं।
एक JSON Pointer ठीक एक मान का नाम देता है और या तो हल होता है
या नहीं होता। इसमें कोई वाइल्डकार्ड या फ़िल्टर नहीं हैं, और यही कारण है कि JSON
Schema, JSON Patch और अधिकांश सत्यापन त्रुटि संदेश इसका उपयोग करते हैं: एक अस्पष्ट
पता वही है जिसकी उन्हें आवश्यकता है। /store/book/0/title एक स्थान का मतलब है।
एक JSONPath क्वेरी एक खोज है। यह कई मान या कोई नहीं लौटा सकती है, और यह फ़िल्टर कर सकती है। इसका उपयोग तब करें जब आप पहले से नहीं जानते कि जो आप चाहते हैं वह कहाँ है।
यदि आप पता जानते हैं, तो pointer का उपयोग करें। यदि आप कुछ खोज रहे हैं, तो क्वेरी का उपयोग करें। इस साइट पर दोनों उपकरण प्रत्येक परिणाम की पंक्ति रिपोर्ट करते हैं, इसलिए किसी भी तरीके से आप एक अमूर्त परिणाम सूची में नहीं बल्कि दस्तावेज़ में वापस आ जाते हैं।