क्या कोई JSON XQuery / XPath के बराबर है?


221

जब जटिल JSON सरणियों और हैश में वस्तुओं की खोज करते हैं, जैसे:

[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [
            // etc.
        }]
    }
]

क्या किसी प्रकार की क्वेरी भाषा है जिसका उपयोग मैं आइटम खोजने के लिए कर सकता हूं in [0].objects where id = 3?


जब तक आप एक नहीं बनाते। सर्वर से क्वेरी छोड़ दें, और केवल आवश्यक डेटा प्राप्त करने के लिए REST का उपयोग करें।
zzzzBov

5
+1 अच्छा विचार। यह कल लिखो ...

2
XPath नहीं, लेकिन मैंने JLinq को बहुत अच्छा पाया है (जो कोड को पढ़ने के लिए बनाता है in(...).where(...).select(...)): hugoware.net/Projects/jLinq
pimvdb

4
यह निराशाजनक है क्योंकि वहाँ बहुत सारे पुस्तकालय हैं, लेकिन सामान्य रूप से स्वीकृत मानक के करीब कुछ भी नहीं है। हमारे पास 3 पार्टियों द्वारा उपयोग की जाने वाली एक लाइब्रेरी है, इसलिए हमें एक क्वेरी भाषा प्रदान करने की आवश्यकता है जो व्यापक रूप से ज्ञात और उपयोग की जाती है।
डेविड थिएलेन

1
ज़रूर, आप jsel - github.com/dragonworx/jsel का उपयोग कर सकते हैं - आपको दिया गया एक वैरिएबल है dataजिसमें आपकी JSON ऑब्जेक्ट है, आप लिखेंगे: jsel(data).select("//*[@id=3]")और यह 3. के साथ आईडी कुंजी वाले ऑब्जेक्ट को लौटाएगा
अली

जवाबों:


122

हाँ, इसे JSONPath कहा जाता है । स्रोत अब GitHub पर है

यह DOJO में भी एकीकृत है ।


3
ब्रायन के जवाब से पता चलता है कि डोजो में jsonPath मॉड्यूल के बजाय jsonQuery मॉड्यूल का उपयोग किया जाना चाहिए ।
हुगोमग

5
यह कितना ठोस है? और मुझे एक जावा या सी # संस्करण नहीं मिल सकता है जो हमारे लिए एक सौदा हत्यारा है।
डेविड थिएलेन

2
यहाँ से जुड़ी साइट जावास्क्रिप्ट और PHP के लिए प्रदान करती है। यदि आपको जावा कार्यान्वयन की आवश्यकता है, तो यहां एक है: code.google.com/p/json-path
Matthias Ronge

2
मुझे यह उल्लेख करना चाहिए कि JSONPath XPath औपचारिक शब्दार्थ पर आधारित नहीं है। JSONiq एक बेहतर विकल्प हो सकता है।
wcandillon

1
@Paramaeleon जो बहुत अच्छा काम करता है। इस परियोजना को GitHub में स्थानांतरित कर दिया गया है । माइक इसे जवाब में जोड़ना चाह सकते हैं, क्योंकि लोग इस बारे में टिप्पणी करते रहते हैं।
फ्रैंकलिन यू

21

मुझे लगता है कि JSONQuery JSONPath का सुपरसेट है और इस तरह इसे डोजो में बदल देता है । फिर RQL भी है ।

डोजो प्रलेखन से:

JSONQuery सुरक्षा, उपयोग में आसानी, और फ़िल्टरिंग, पुनरावर्ती खोज, सॉर्टिंग, मैपिंग, श्रेणी चयन, और वाइल्डकार्ड स्ट्रिंग जेल और विभिन्न ऑपरेटरों के साथ लचीले भाव सहित डेटा क्वेरी टूल का एक व्यापक सेट के साथ JSONPath का विस्तारित संस्करण है।

JSONselect के प्रश्न पर एक और दृष्टिकोण है (CSS चयनकर्ता की तरह, XPath के बजाय) और जावास्क्रिप्ट कार्यान्वयन है


4
गिथब JSONQuery लिंक मृत प्रतीत होता है। JSONSelect में अब एक जावास्क्रिप्ट संस्करण भी है।
हेनरिक एसोरेंसन डेस 20'12

19

अन्य विकल्पों से मैं अवगत हूं

  1. JSONiq विनिर्देश, जो भाषाओं के दो उपप्रकारों को निर्दिष्ट करता है: एक जो एक्सएमएल विवरण को छुपाता है और जेएस-जैसे सिंटैक्स प्रदान करता है, और एक जो जेएसएन कंस्ट्रक्टर्स और जैसे एक्सएक्सएक्स सिंटैक्स को समृद्ध करता है। ज़ोरबा ने जोंसीक को लागू किया।
  2. कोरोना , जो मार्कलॉजिक के शीर्ष पर है, XML, JSON, टेक्स्ट और बाइनरी सामग्री को संग्रहीत करने, प्रबंधित करने और खोजने के लिए एक REST इंटरफ़ेस प्रदान करता है।
  3. MarkLogic 6 और बाद में एक समान REST इंटरफ़ेस प्रदान करता है जैसा कि कोरोना बॉक्स से बाहर है।
  4. MarkLogic 8 और बाद में JSON को उनके XQuery और सर्वर-साइड जावास्क्रिप्ट वातावरण दोनों में मूल रूप से समर्थन करता है। आप उस पर XPath लागू कर सकते हैं।

HTH।


3
अब एक JSONiq कार्यान्वयन है: Zorba 2.6 आधिकारिक तौर पर इसका समर्थन करता है।
घिसलेन फोरनी

नोट: MarkLogic JSON को मूल रूप से संस्करण 8 के रूप में संग्रहीत करता है, और इस पर सीधे XPath लगाने की अनुमति देता है।
grtjn

18

JSON डेटा को ट्रेस करने / फ़िल्टर करने के लिए वर्तमान विकल्पों में से कुछ को संक्षेप में प्रस्तुत करने के लिए, और कुछ वाक्यविन्यास उदाहरण प्रदान करें ...

  • JSPath
    .automobiles{.maker === "Honda" && .year > 2009}.model

  • json: select () (CSS चयनकर्ताओं से अधिक प्रेरित)
    .automobiles .maker:val("Honda") .model

  • JSONPath (XPath द्वारा प्रेरित)
    $.automobiles[?(@.maker='Honda')].model

मुझे लगता है कि JSPath सबसे अच्छा दिखता है, इसलिए मैं अपने AngularJS + CakePHP ऐप के साथ इसे आज़माने और एकीकृत करने जा रहा हूं।

(मैंने मूल रूप से इस उत्तर को एक और धागे में पोस्ट किया था, लेकिन सोचा कि यह यहां भी उपयोगी होगा।)


महान सारांश और उदाहरण, सीएसएस चयनकर्ताओं या XPath में मिली प्रेरणा का उल्लेख करने के कारण भी।
जोकेम शुल्नेक्लोपर

13

प्रयोग करने की कोशिश करें JSPath

JSPath एक डोमेन-विशिष्ट भाषा (DSL) है जो आपको अपने JSON दस्तावेज़ों में डेटा को नेविगेट करने और खोजने में सक्षम बनाती है। JSPath का उपयोग करते हुए, आप JSON की वस्तुओं का चयन कर सकते हैं ताकि उनके पास मौजूद डेटा पुनः प्राप्त हो सके।

JSON के लिए JSON XML के लिए XPath की तरह है।

यह Node.js और आधुनिक ब्राउज़र दोनों के लिए भारी अनुकूलित है।


9

XQuery का उपयोग JSON को क्वेरी करने के लिए किया जा सकता है, बशर्ते कि प्रोसेसर JSON समर्थन प्रदान करता है। यह एक सरल उदाहरण है कि बेस को "आईडी" = 1 के साथ वस्तुओं को खोजने के लिए कैसे उपयोग किया जा सकता है:

json:parse('[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [ "etc." ] }
    ]}
]')//value[.//id = 1]

(6 साल पर) सेक्सन XQuery 3.1 चलाएगा, जो JSON पर सवाल उठाता है। मेरा सैक्सन अनुभव जावा द्वारा संचालित जार फ़ाइल का उपयोग कर रहा है। सैक्सोन-जावा नाम का एक नोड मॉड्यूल है, लेकिन मुझे यकीन नहीं है कि यह w / json कैसे काम करता है। और सैक्सोनिका से एक और नई बात है जिसे सैक्सन-जेएस कहा जाता है।
charles

9

क्या किसी प्रकार की क्वेरी भाषा है ...

JQ एक को परिभाषित करता है जम्मू बेटे क्ष uery भाषा है कि बहुत JSONPath के समान है - देखना https://github.com/stedolan/jq/wiki/For-JSONPath-users

... [जो] मैं एक आइटम को खोजने के लिए उपयोग किया जा सकता है [0] .objects जहां आईडी = 3?

मैं इसका मतलब यह मानूंगा: सभी JSON ऑब्जेक्ट्स को id == 3 के साथ निर्दिष्ट कुंजी के अंतर्गत खोजें, चाहे कोई भी वस्तु हो। एक संगत jq क्वेरी होगी:

.[0].objects | .. | objects | select(.id==3)

जहाँ "|" पाइप-ऑपरेटर है (कमांड शेल पाइप के रूप में), और जहां सेगमेंट ".. | ऑब्जेक्ट" से संबंधित है "जहां कोई वस्तु नहीं हो सकती"।

Jq की मूल बातें काफी हद तक स्पष्ट या सहज या कम से कम काफी सरल हैं, और बाकी सभी को उठाना आसान है अगर आप कमांड-शेल पाइप से परिचित हैं। Jq FAQ में पॉइंटर्स टू ट्यूटोरियल और लाइक है ।

jq भी SQL की तरह है जिसमें यह CRUD ऑपरेशंस को सपोर्ट करता है, हालाँकि jq प्रोसेसर कभी भी इसके इनपुट को ओवरराइट नहीं करता है। jq JSON संस्थाओं की धाराओं को भी संभाल सकता है।

दो अन्य मापदंड जो आप JSON- उन्मुख क्वेरी भाषा का आकलन करने पर विचार कर सकते हैं:

  • क्या यह नियमित अभिव्यक्ति का समर्थन करता है? (jq 1.5 को PCRE regex का व्यापक समर्थन प्राप्त है)
  • क्या यह ट्यूरिंग-पूर्ण है? (हां)

8

Defiant.js भी बहुत अच्छा लग रहा है, यहाँ एक सरल उदाहरण है:

var obj = {
        "car": [
            {"id": 10, "color": "silver", "name": "Volvo"},
            {"id": 11, "color": "red",    "name": "Saab"},
            {"id": 12, "color": "red",    "name": "Peugeot"},
            {"id": 13, "color": "yellow", "name": "Porsche"}
        ],
        "bike": [
            {"id": 20, "color": "black", "name": "Cannondale"},
            {"id": 21, "color": "red",   "name": "Shimano"}
        ]
    },
    search = JSON.search(obj, '//car[color="yellow"]/name');

console.log( search );
// ["Porsche"]

var reds = JSON.search(obj, '//*[color="red"]');

for (var i=0; i<reds.length; i++) {
    console.log( reds[i].name );
}
// Saab
// Peugeot
// Shimano

दुर्भाग्य से, इस समय npm पर प्रकाशित नहीं किया गया है और मैन्युअल इंस्टॉलेशन की आवश्यकता है ...
एंड्रयू माओ


7

Jsel कमाल है और एक वास्तविक XPath इंजन पर आधारित है। यह आपको एक्सपीथ एक्सप्रेशन बनाने के लिए किसी भी प्रकार के जावास्क्रिप्ट डेटा को खोजने की अनुमति देता है, न कि केवल वस्तुओं (तार भी)।

XPath इंजन द्वारा आपके डेटा को कैसे चलाया जा सकता है, इस पर पूर्ण नियंत्रण देने के लिए आप कस्टम स्कीमा और मैपिंग बना सकते हैं। एक स्कीमा यह परिभाषित करने का एक तरीका है कि आपके डेटा में तत्वों, बच्चों, विशेषताओं और नोड मानों को कैसे परिभाषित किया गया है। तब आप सूट करने के लिए अपनी अभिव्यक्ति बना सकते हैं।

यह देखते हुए कि आपके पास एक चर है dataजिसमें सवाल से JSON समाहित है, आप लिखने के लिए jsel का उपयोग कर सकते हैं:

jsel(data).select("//*[@id=3]")

यह id3. की ​​विशेषता के साथ किसी भी नोड को लौटाएगा । एक विशेषता एक वस्तु के भीतर किसी भी आदिम (स्ट्रिंग, संख्या, दिनांक, regex) मान है।


6

ObjectPath XPath या JSONPath के समान एक क्वेरी भाषा है, लेकिन एम्बेडेड अंकगणितीय गणना, तुलना तंत्र और अंतर्निहित कार्यों के लिए बहुत अधिक शक्तिशाली धन्यवाद। वाक्य-विन्यास देखें:

दुकान में खोजें लाल रंग के सभी जूते और कीमत 50 से कम

$ .. जूते। * [रंग "लाल" है और कीमत <50]


मुझे वेबसाइट पर पहला उदाहरण पसंद है और यह बहुत अच्छा है कि ObjectPath को इंटरएक्टिव, शेल-जैसे मोड में चलाया जा सकता है, लेकिन मैं जो देख रहा हूं वह पायथन स्क्रिप्ट में ObjectPath का उपयोग करना है। क्या आप मुझे एक उदाहरण के रूप में दिखा सकते हैं कि कैसे एक पुस्तकालय के रूप में ऑब्जेक्टपैथ का उपयोग किया जाए? मुझे वेबसाइट पर ऐसा कुछ नहीं मिल रहा है।
piokuc

कृपया गीथूब पर पायथन के उपयोग के बारे में अनुभाग देखें । हम इसे वेबसाइट पर जोड़ देंगे - इस समय इसे खोजना बहुत मुश्किल है। यदि आपको किसी और सहायता की आवश्यकता है, तो आप Google समूह पर एक प्रश्न पोस्ट कर सकते हैं ।
इला बेदनरेक

धन्यवाद, इला, जीथब पृष्ठ पर जोड़े गए उदाहरण वास्तव में वही थे जो आवश्यक थे।
पीयूसीक

4

@Naftule - "defiant.js" के साथ, XPath अभिव्यक्तियों के साथ JSON संरचना को क्वेरी करना संभव है। कैसे काम करता है, इसका अंदाजा लगाने के लिए इस मूल्यांकनकर्ता की जाँच करें:

http://www.defiantjs.com/#xpath_evaluator

JSONPath के विपरीत, "defiant.js" JSON संरचनाओं पर XPath के क्वेरी सिंटैक्स - के पूर्ण पैमाने पर समर्थन प्रदान करता है।

Defiant.js का स्रोत कोड यहां पाया जा सकता है:
https://github.com/hbi99/defiant.js


3

JMESPath इन दिनों बहुत लोकप्रिय हो रहा है (2020 तक) और JSONPath के साथ कई मुद्दों को संबोधित करता है। यह कई भाषाओं के लिए उपलब्ध है।


1

यदि आप मेरे जैसे हैं और आप केवल पथ-आधारित लुकअप करना चाहते हैं, लेकिन असली XPath, लॉश के _.get()काम नहीं कर सकते हैं। लॉश डॉक्स से उदाहरण:

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// → 3

_.get(object, ['a', '0', 'b', 'c']);
// → 3

_.get(object, 'a.b.c', 'default');
// → 'default'

दुर्भाग्य से वह फ़ंक्शन केवल एक ही परिणाम लौटा सकता है, यह मेल खाने वाले आइटमों की एक सरणी लाने का समर्थन नहीं करता है, जो अन्य पुस्तकालयों को चमकता है।
सिमोन ईस्ट

0

इसे आज़माएं - https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java

यह xml के लिए xpath की समान रेखा पर एक बहुत ही सरल कार्यान्वयन है। इसे जेपीथ नाम दिया गया है।


1
इस प्रश्न को javascript टैग किया गया है लेकिन यह लाइब्रेरी java के
tripleee

इसका एक जावास्क्रिप्ट संस्करण भी है - github.com/satyapaul/jpath/blob/master/jpath.js यहाँ वह इस परियोजना के लिए होम पेज - github.com/satyapaul/jpath
सत्यजीत पॉल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.