JSONPath क्वेरी गाइड: JSON डेटा कैसे खोजें
JSON वेब की सार्वभौमिक भाषा बन गया है। API JSON लौटाते हैं, कॉन्फ़िगरेशन फ़ाइलें JSON का उपयोग करती हैं, डेटाबेस JSON दस्तावेज़ संग्रहीत करते हैं। लेकिन जैसे-जैसे JSON संरचनाएँ बड़ी और गहरी नेस्टेड होती जाती हैं, विशिष्ट मान खोजना कठिन होता जाता है। यहीं JSONPath आता है। JSONPath एक क्वेरी भाषा है जो आपको संक्षिप्त पथ एक्सप्रेशन का उपयोग करके JSON दस्तावेज़ों में डेटा नेविगेट और निकालने देती है, ठीक वैसे ही जैसे XPath, XML के लिए करता है। यह गाइड बुनियादी सिंटैक्स से लेकर उन्नत फ़िल्टरिंग तक सब कुछ कवर करती है, व्यावहारिक उदाहरणों के साथ जिन्हें आप तुरंत लागू कर सकते हैं।
JSONPath क्या है?
JSONPath एक JSON क्वेरी भाषा है, जिसे मूल रूप से 2007 में Stefan Goessner द्वारा प्रस्तावित किया गया था। यह JSON दस्तावेज़ों से नोड्स का चयन करने के लिए एक कॉम्पैक्ट सिंटैक्स प्रदान करता है, जैसे CSS सेलेक्टर्स HTML एलिमेंट्स को लक्षित करते हैं या XPath एक्सप्रेशन XML नोड्स को लक्षित करते हैं। JSON संरचना को पार करने के लिए लूप और कंडीशनल लॉजिक लिखने के बजाय, आप बस एक एक्सप्रेशन लिखते हैं जो आपके इच्छित डेटा के पथ का वर्णन करता है।
JSONPath एक्सप्रेशन JSON दस्तावेज़ के रूट नोड से शुरू होते हैं और ऑब्जेक्ट्स और ऐरे के माध्यम से वांछित मान तक नेविगेट करते हैं। भाषा वाइल्डकार्ड, रिकर्सिव डिसेंट, ऐरे स्लाइसिंग और फ़िल्टर एक्सप्रेशन का समर्थन करती है, जो अधिकांश डेटा निष्कर्षण आवश्यकताओं के लिए पर्याप्त है।
उदाहरण JSON दस्तावेज़
इस गाइड में, हम निम्नलिखित JSON दस्तावेज़ को कार्यशील उदाहरण के रूप में उपयोग करेंगे। यह मूल 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
},
{
"category": "fiction",
"author": "J.R.R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}JSONPath सिंटैक्स संदर्भ
JSONPath ऑपरेटरों के एक छोटे सेट का उपयोग करता है जो शक्तिशाली क्वेरी बनाने के लिए संयोजित होते हैं। यहाँ पूर्ण सिंटैक्स संदर्भ है:
| ऑपरेटर | विवरण | उदाहरण |
|---|---|---|
| $ | दस्तावेज़ का रूट नोड | $ |
| . | चाइल्ड ऑपरेटर (ऑब्जेक्ट प्रॉपर्टीज़ तक पहुँच) | $.store |
| [] | ऐरे इंडेक्स या चाइल्ड ऑपरेटर | $.store.book[0] |
| [*] | सभी ऐरे एलिमेंट्स के लिए वाइल्डकार्ड | $.store.book[*] |
| .. | रिकर्सिव डिसेंट (सभी स्तरों पर खोज) | $..author |
| .key | नामित ऑब्जेक्ट प्रॉपर्टी | $.store.bicycle |
| ['key'] | प्रॉपर्टी एक्सेस के लिए ब्रैकेट नोटेशन | $['store']['book'] |
| [start:end] | ऐरे स्लाइस (अंत इंडेक्स शामिल नहीं) | $.store.book[0:2] |
| [?()] | फ़िल्टर एक्सप्रेशन | < 10)] |
| () | स्क्रिप्ट एक्सप्रेशन (कार्यान्वयन-निर्भर) | $.store.book[(@.length-1)] |
बुनियादी JSONPath एक्सप्रेशन
रूट नोड और प्रत्यक्ष चाइल्ड नोड तक पहुँचना
डॉलर चिह्न $ JSON दस्तावेज़ के रूट नोड का प्रतिनिधित्व करता है। वहाँ से, आप ऑब्जेक्ट प्रॉपर्टीज़ तक पहुँचने के लिए डॉट नोटेशन और ऐरे इंडेक्स तक पहुँचने के लिए ब्रैकेट नोटेशन का उपयोग करते हैं।
| एक्सप्रेशन | परिणाम |
|---|---|
| $ | संपूर्ण JSON दस्तावेज़ |
| $.store | store ऑब्जेक्ट (book ऐरे और bicycle ऑब्जेक्ट शामिल) |
| $.store.bicycle | {"color": "red", "price": 19.95} |
| $.store.bicycle.color | "red" |
| $.store.book | संपूर्ण book ऐरे |
| $.store.book[0] | पहला book ऑब्जेक्ट |
| $.store.book[0].title | "Sayings of the Century" |
| $.store.book[3].author | "J.R.R. Tolkien" |
ब्रैकेट नोटेशन
ब्रैकेट नोटेशन डॉट नोटेशन का विकल्प है, जब प्रॉपर्टी नाम में विशेष वर्ण, स्पेस हों या अंक से शुरू होता हो तो उपयोगी है:
$.store['book'][0]['title']
$['store']['bicycle']['color']ब्रैकेट नोटेशन और डॉट नोटेशन ऑब्जेक्ट प्रॉपर्टीज़ के लिए विनिमेय हैं। हालाँकि, जब प्रॉपर्टी नाम गतिशील हो या डॉट नोटेशन में अमान्य वर्ण हों तो ब्रैकेट नोटेशन अनिवार्य है।
वाइल्डकार्ड ऑपरेटर
वाइल्डकार्ड ऑपरेटर * ऐरे के सभी एलिमेंट्स या ऑब्जेक्ट की सभी प्रॉपर्टीज़ से मेल खाता है। यह विशिष्ट कुंजी या इंडेक्स जाने बिना किसी स्तर पर सभी मान निकालने के लिए अत्यंत उपयोगी है।
| एक्सप्रेशन | परिणाम |
|---|---|
| $.store.* | store ऑब्जेक्ट में सभी मान (book ऐरे और bicycle ऑब्जेक्ट) |
| $.store.book[*] | ऐरे में सभी पुस्तकें (सभी चार book ऑब्जेक्ट) |
| $.store.book[*].author | सभी लेखक नाम: ["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J.R.R. Tolkien"] |
| $.store.*.price | bicycle की कीमत और book ऐरे (एकल पुस्तक की कीमत नहीं) |
रिकर्सिव डिसेंट: डबल डॉट ऑपरेटर
डबल डॉट ऑपरेटर .. JSONPath की सबसे शक्तिशाली विशेषताओं में से एक है। यह JSON ट्री के हर स्तर पर निर्दिष्ट कुंजी खोजता है, न कि केवल प्रत्यक्ष चाइल्ड नोड्स पर। इसे पूरे दस्तावेज़ की गहरी खोज के रूप में सोचें।
| एक्सप्रेशन | परिणाम |
|---|---|
| $..author | दस्तावेज़ में सभी स्थानों पर author मान |
| $..price | सभी price मान: [8.95, 12.99, 8.99, 22.99, 19.95] |
| $..book[2] | तीसरी पुस्तक, रिकर्सिव रूप से पाई गई |
| $..category | सभी category मान: ["reference", "fiction", "fiction", "fiction"] |
रिकर्सिव डिसेंट ऑपरेटर विशेष रूप से तब उपयोगी है जब आप अपने इच्छित डेटा का सटीक पथ नहीं जानते, या जब एक ही कुंजी कई नेस्टेड स्तरों पर दिखाई देती है। उदाहरण के लिए, यदि API प्रतिक्रिया में विभिन्न नेस्टेड स्तरों पर id फ़ील्ड है, तो $..id सभी id एकत्र करेगा।
ऐरे स्लाइसिंग
ऐरे स्लाइसिंग आपको ऐरे से एलिमेंट्स की एक रेंज चुनने देती है। सिंटैक्स [start:end] प्रारंभ इंडेक्स से लेकर (लेकिन शामिल नहीं) अंत इंडेक्स तक के एलिमेंट्स का चयन करता है। सकारात्मक और नकारात्मक दोनों इंडेक्स समर्थित हैं।
| एक्सप्रेशन | परिणाम |
|---|---|
| $.store.book[0:2] | पहली दो पुस्तकें (इंडेक्स 0 और 1) |
| $.store.book[1:3] | दूसरी और तीसरी पुस्तक (इंडेक्स 1 और 2) |
| $.store.book[-1] | अंतिम पुस्तक (The Lord of the Rings) |
| $.store.book[-2:] | अंतिम दो पुस्तकें |
| $.store.book[:2] | पहली दो पुस्तकें ([0:2] के समान) |
| $.store.book[2:] | तीसरी पुस्तक और उसके बाद |
ध्यान दें कि स्लाइसिंग व्यवहार विभिन्न JSONPath कार्यान्वयनों के बीच थोड़ा भिन्न हो सकता है। उपरोक्त सिंटैक्स अधिकांश लोकप्रिय लाइब्रेरी और IETF RFC 9535 मानक द्वारा उपयोग की जाने वाली परंपरा का पालन करता है।
फ़िल्टर एक्सप्रेशन
फ़िल्टर एक्सप्रेशन वह जगह है जहाँ JSONPath वास्तव में शक्तिशाली बनता है। वे आपको स्थिति के बजाय शर्तों के आधार पर एलिमेंट्स चुनने देते हैं। फ़िल्टर सिंटैक्स [?(condition)] का उपयोग करता है, जहाँ प्रत्येक एलिमेंट के लिए शर्त का मूल्यांकन किया जाता है।
तुलना ऑपरेटर
JSONPath फ़िल्टर एक्सप्रेशन में निम्नलिखित तुलना ऑपरेटरों का समर्थन करता है:
| ऑपरेटर | अर्थ | उदाहरण |
|---|---|---|
| == | बराबर | [?(@.category == "fiction")] |
| != | बराबर नहीं | [?(@.category != "fiction")] |
| < | से कम | < 10)] |
| <= | से कम या बराबर | <= 8.99)] |
| > | से अधिक | [?(@.price > 15)] |
| >= | से अधिक या बराबर | [?(@.price >= 12.99)] |
| =~ | रेगेक्स मिलान (आंशिक कार्यान्वयन) | [?(@.author =~ /Tolkien/i)] |
व्यावहारिक फ़िल्टर उदाहरण
हमारे उदाहरण दस्तावेज़ का उपयोग करते हुए, यहाँ व्यावहारिक फ़िल्टर एक्सप्रेशन और उनके परिणाम हैं:
Find all books cheaper than $10:
< 10)]पुस्तकें "Sayings of the Century" ($8.95) और "Moby Dick" ($8.99) लौटाता है।
Find all fiction books:
$.store.book[?(@.category == "fiction")]तीन पुस्तकें लौटाता है: "Sword of Honour", "Moby Dick" और "The Lord of the Rings"।
Find books with an ISBN:
$.store.book[?(@.isbn)]isbn प्रॉपर्टी वाली पुस्तकें लौटाता है: "Moby Dick" और "The Lord of the Rings"। ऐसा इसलिए क्योंकि फ़िल्टर जाँचता है कि प्रॉपर्टी मौजूद है या नहीं।
Find the most expensive book:
$.store.book[?(@.price > 20)]"The Lord of the Rings" ($22.99) लौटाता है।
फ़िल्टर में लॉजिकल ऑपरेटर
आप लॉजिकल ऑपरेटरों का उपयोग करके शर्तों को संयोजित कर सकते हैं:
< 10 && @.category == "fiction")]
$.store.book[?(@.price > 15 || @.category == "reference")]पहला एक्सप्रेशन $10 से कम की फिक्शन पुस्तकें खोजता है (केवल "Moby Dick")। दूसरा $15 से अधिक या संदर्भ श्रेणी की पुस्तकें खोजता है ("Sayings of the Century" और "The Lord of the Rings" लौटाता है)।
JSONPath बनाम XPath
JSONPath स्पष्ट रूप से XPath पर आधारित है, और दोनों भाषाओं में कई वैचारिक समानताएँ हैं। यदि आप XML प्रसंस्करण से परिचित हैं, तो इस संबंध को समझना मददगार होगा।
| कार्य | JSONPath | XPath |
|---|---|---|
| रूट सिंबल | $ | / |
| चाइल्ड एक्सेस | .key या ['key'] | /element |
| ऐरे इंडेक्स | [0] | [1] (1 से शुरू) |
| वाइल्डकार्ड | * | * |
| रिकर्सिव डिसेंट | .. | // |
| फ़िल्टर | [?(condition)] | [condition] |
| प्रॉपर्टी | लागू नहीं (JSON में एट्रिब्यूट नहीं हैं) | @attr |
| वर्तमान नोड | @ (फ़िल्टर में) | . या current() |
| पैरेंट | समर्थित नहीं | .. |
| एक्सिस | समर्थित नहीं | 13 एक्सिस (ancestor, following, आदि) |
| डेटा मॉडल | ऑब्जेक्ट और ऐरे | एलिमेंट, एट्रिब्यूट, टेक्स्ट नोड |
मुख्य अंतर यह है कि XPath एलिमेंट्स, एट्रिब्यूट्स, टेक्स्ट नोड्स, नेमस्पेस और प्रोसेसिंग इंस्ट्रक्शन वाले समृद्ध ट्री मॉडल पर काम करता है। JSONPath ऑब्जेक्ट्स (की-वैल्यू मैप) और ऐरे (ऑर्डर्ड लिस्ट) के सरल मॉडल पर काम करता है। यह सरलता JSONPath को सीखना आसान बनाती है लेकिन जटिल क्वेरी के लिए XPath जितनी अभिव्यंजक नहीं है।
JSONPath का अभ्यास
API परीक्षण
JSONPath API परीक्षण के लिए अपरिहार्य है। जब आप API को अनुरोध भेजते हैं और बड़ी JSON प्रतिक्रिया प्राप्त करते हैं, तो JSONPath आपको पूरी संरचना को मैन्युअल रूप से नेविगेट किए बिना विशिष्ट मानों की पुष्टि करने देता है। अधिकांश API परीक्षण उपकरण मूल रूप से JSONPath का समर्थन करते हैं।
उदाहरण के लिए, परीक्षण में आप सत्यापित कर सकते हैं कि पहली पुस्तक की कीमत $10 से कम है:
// Using a JSONPath assertion in testing
response.jsonPath().get("store.book[0].price").should(equals(8.95));
// Find all books by a specific author
response.jsonPath().get("store.book[?(@.author == 'Herman Melville')].title");
// Returns: ["Moby Dick"]डेटा रूपांतरण
विभिन्न डेटा प्रारूपों का उपयोग करने वाले सिस्टम को एकीकृत करते समय, JSONPath विशिष्ट फ़ील्ड निकालने और रूपांतरित करने में मदद करता है। आप जटिल ट्रैवर्सल कोड लिखे बिना एक JSON संरचना से मान निकालकर दूसरी में मैप कर सकते हैं।
कॉन्फ़िगरेशन प्रबंधन
जटिल कॉन्फ़िगरेशन फ़ाइलों में अक्सर गहराई से नेस्टेड JSON होता है। JSONPath आपको पूरी संरचना को लोड और पार्स किए बिना विशिष्ट कॉन्फ़िगरेशन मान क्वेरी करने देता है। jq जैसे उपकरण कमांड-लाइन पाइपलाइनों में JSON को प्रोसेस करने के लिए JSONPath-जैसे सिंटैक्स का उपयोग करते हैं।
निगरानी और अलर्टिंग
ऑब्ज़र्वेबिलिटी सिस्टम में, JSONPath क्वेरी JSON-स्वरूपित लॉग और API प्रतिक्रियाओं से मेट्रिक्स निकाल सकती हैं। आप JSONPath क्वेरी के थ्रेशोल्ड से अधिक मान लौटाने पर ट्रिगर होने वाले अलर्ट सेट कर सकते हैं।
JSONPath कार्यान्वयन
JSONPath लगभग हर प्रोग्रामिंग भाषा में उपलब्ध है। यहाँ सबसे लोकप्रिय लाइब्रेरी हैं:
| भाषा | लाइब्रेरी | इंस्टॉलेशन |
|---|---|---|
| JavaScript | jsonpath-plus | npm install jsonpath-plus |
| Python | jsonpath-ng | pip install jsonpath-ng |
| Java | JsonPath (Jayway) | Maven: com.jayway.jsonpath |
| C# | Json.NET (Newtonsoft) | NuGet: Newtonsoft.Json |
| Go | gjson | go get github.com/tidwall/gjson |
| PHP | jsonpath | composer require softcreatr/jsonpath |
| Ruby | jsonpath | gem install jsonpath |
JavaScript उदाहरण
< 10)]',
json: data
});
// Returns books with price < 10
Python Example
from jsonpath_ng import parse
data = { /* our sample JSON */ }
# Find all authors
author_expr = parse('$..author')
authors = [match.value for match in author_expr.find(data)]
# ["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J.R.R. Tolkien"]
# Find cheap books
cheap_expr = parse('$.store.book[?(@.price < 10)]')
cheap_books = [match.value for match in cheap_expr.find(data)]
Common Pitfalls and Tips
- Zero-based vs one-based indexing: JSONPath uses zero-based indexing (the first element is [0]), while XPath uses one-based indexing (the first element is [1]). This is a common source of off-by-one errors.
- Implementation differences: Before the IETF standard (RFC 9535), JSONPath implementations varied in their handling of edge cases like empty results, null values, and filter syntax. Always test your expressions with the specific library you are using.
- Filter performance: Recursive descent with filters (
$..book[?(@.price < 10)]) can be slow on large documents because it must traverse the entire tree. For performance-critical applications, use more specific paths when possible. - Case sensitivity: JSONPath is case-sensitive.
$.Storewill not match$.store. This is consistent with JSON's case-sensitive nature. - ज़ीरो-बेस्ड बनाम वन-बेस्ड इंडेक्सिंग: JSONPath ज़ीरो-बेस्ड इंडेक्सिंग का उपयोग करता है (पहला एलिमेंट [0] है), जबकि XPath वन-बेस्ड इंडेक्सिंग का उपयोग करता है (पहला एलिमेंट [1] है)। यह ऑफ-बाय-वन त्रुटियों का एक सामान्य स्रोत है।
- कार्यान्वयन अंतर: IETF मानक (RFC 9535) से पहले, JSONPath कार्यान्वयन खाली परिणामों, null मानों और फ़िल्टर सिंटैक्स जैसे किनारे के मामलों को संभालने में भिन्न थे। हमेशा अपनी विशिष्ट लाइब्रेरी के साथ एक्सप्रेशन का परीक्षण करें।
सामान्य नुकसान और युक्तियाँ
2024 में, IETF ने RFC 9535 प्रकाशित किया, जिसने JSONPath को औपचारिक रूप से मानकीकृत किया। विनिर्देश कार्यान्वयनों के बीच मौजूद कई अस्पष्टताओं और असंगतियों को हल करता है। मानक के प्रमुख पहलुओं में शामिल हैं:
- < 10)]) बड़े दस्तावेज़ों पर धीमा हो सकता है क्योंकि इसे पूरे ट्री को पार करना पड़ता है। प्रदर्शन-महत्वपूर्ण अनुप्रयोगों के लिए, जब संभव हो अधिक विशिष्ट पथ का उपयोग करें।
- केस सेंसिटिविटी: JSONPath केस-सेंसिटिव है। $.Store, $.store से मेल नहीं खाएगा। यह JSON की केस-सेंसिटिव प्रकृति के अनुरूप है।
- विशेष वर्णों को एस्केप करना: यदि कुंजी नाम में डॉट या ब्रैकेट हैं, तो उद्धृत ब्रैकेट नोटेशन का उपयोग करें: $.key.with.dots के बजाय $['key.with.dots']।
- कोई पैरेंट ट्रैवर्सल नहीं: XPath के विपरीत, JSONPath पैरेंट नोड पर नेविगेट नहीं कर सकता। XPath के .. (पैरेंट एक्सिस) का कोई समकक्ष नहीं है। JSONPath का .. रिकर्सिव डिसेंट को दर्शाता है, पैरेंट को नहीं।
यदि आप एक नया प्रोजेक्ट शुरू कर रहे हैं, तो अधिकतम संगतता और पूर्वानुमेय व्यवहार के लिए RFC 9535 लागू करने वाली लाइब्रेरी को प्राथमिकता दें।
JSON डेटा को जल्दी से क्वेरी करने की आवश्यकता है? अपने JSON दस्तावेज़ों के विरुद्ध वास्तविक समय में एक्सप्रेशन का मूल्यांकन करने के लिए हमारा मुफ्त ऑनलाइन JSONPath टेस्टर आज़माएँ।
JSONPath फ़ाइंडर आज़माएँIETF मानक: RFC 9535
Python उदाहरण
JSONPath एक JSON क्वेरी भाषा है, जैसे XPath, XML के लिए है। यह JSON दस्तावेज़ों में विशिष्ट मानों को नेविगेट और निकालने के लिए पथ एक्सप्रेशन का उपयोग करती है। $.store.book[0].title जैसे JSONPath एक्सप्रेशन आपको कस्टम पार्सिंग कोड लिखे बिना जटिल नेस्टेड JSON संरचनाओं में डेटा को सटीक रूप से इंगित करने देते हैं।
JSONPath क्या है?
JSONPath विशेष रूप से JSON के ऑब्जेक्ट और ऐरे संरचनाओं के लिए डिज़ाइन किया गया है, जबकि XPath XML के एलिमेंट और एट्रिब्यूट ट्री के लिए डिज़ाइन किया गया है। JSONPath रूट नोड के लिए $, ऑब्जेक्ट एक्सेस के लिए डॉट नोटेशन और ऐरे एक्सेस के लिए ब्रैकेट नोटेशन का उपयोग करता है। XPath पथ विभाजक के लिए / और एट्रिब्यूट एक्सेस के लिए @ का उपयोग करता है। JSONPath सरल है लेकिन XPath जितनी सुविधा-संपन्न नहीं है।
JSONPath, XPath से कैसे भिन्न है?
JSONPath में डबल डॉट (..) रिकर्सिव डिसेंट ऑपरेटर है। यह JSON संरचना के सभी स्तरों पर नामित कुंजी खोजता है, न कि केवल प्रत्यक्ष चाइल्ड नोड्स पर। उदाहरण के लिए, $..author पूरे दस्तावेज़ में कहीं भी सभी author कुंजियाँ खोजता है, चाहे वे कितनी भी गहराई में नेस्टेड हों।
JSONPath में डबल डॉट (..) का क्या अर्थ है?
<, ><=, >< 10)] $10 से कम की सभी पुस्तकें खोजता है।
क्या JSONPath शर्तों के आधार पर डेटा फ़िल्टर कर सकता है?
JSONPath मूल रूप से 2007 में Stefan Goessner द्वारा प्रस्तावित किया गया था बिना किसी औपचारिक विनिर्देश के, जिससे कार्यान्वयनों में भिन्नताएँ हुईं। 2024 में, IETF ने RFC 9535 प्रकाशित किया जिसने JSONPath को औपचारिक रूप से मानकीकृत किया। आधुनिक कार्यान्वयन इस मानक की ओर अभिसरित हो रहे हैं, लेकिन कुछ पुरानी लाइब्रेरी में अभी भी मामूली सिंटैक्स अंतर हो सकते हैं।