2015-05-24 5 views
5

यहाँ के लिए मूल्यों को प्राप्त करने के लिए अपने json है टेस्ट 1 "।अजगर में, jsonpath आरडब्ल्यू का उपयोग कर विशिष्ट विशेषता (json/dict)

मैं JsonPath पृष्ठ पर निम्न उदाहरण पाया:

$..book[?(@.price<10)] 

जब निम्नलिखित jsonxpath अभिव्यक्ति पार्स करने का प्रयास:

parse('$..test[?(@.description="Test 1")].id') 

मैं निम्नलिखित त्रुटि मिलती है:

jsonpath_rw.lexer.JsonPathLexerError: Error on line 1, col 7: Unexpected character: ? 

मैं क्या गलत कर रहा हूं? वैकल्पिक रूप से, क्या ऐसा करने का एक बेहतर तरीका है?

+3

अजीब तरह से पर्याप्त, [lexer कोड] को देखकर (https://github.com/kennknowles/python-jsonpath-rw/blob/master/jsonpath_rw/lexer.py), jsonpath आरडब्ल्यू नहीं है '? (बूलियन) 'फ़िल्टर तंत्र का समर्थन करने के लिए प्रतीत होता है। – voithos

उत्तर

7

ऐसा लगता है कि jsonpath-rw इस सुविधा का समर्थन नहीं करता है। शायद एक और पुस्तकालय पर विचार करें? ObjectPath होनहार लग रहा है:

>>> import objectpath 
>>> json_obj = { ... } # This has to be pre-parsed 
>>> tree = objectpath.Tree(json_obj) 
>>> ids = tree.execute('$..test[@.description is "Test 1"].id') 
>>> print list(ids) 
["1"] 

यह काफी वास्तव में JsonPath वाक्य रचना का पालन नहीं करता, लेकिन यह एक असावधान सर्वेक्षण से काफी मिलता-जुलता है, कम से कम। Documentation भी उपलब्ध है।

बेशक, यदि आपका JSON हमेशा एक ही रूप में होगा (यानी आपको लापता बाल वस्तुओं, आदि से निपटने की ज़रूरत नहीं है), तो आप एक सूची समझ का उपयोग करके आसानी से वही क्वेरी कर सकते हैं, या कुछ समान ।

json = { ... } 
ids = [t['id'] for t in json['test'] if t['description'] == 'Test 1'] 
+1

बस ध्यान रखें कि '..' ऑपरेटर (रिकर्सिव वंश/गहरी खोज) बहुत धीमी है। यदि आप सुनिश्चित हैं कि परीक्षण दस्तावेज़ की जड़ में है और केवल दस्तावेज़ की जड़ में है, तो '.' का प्रयोग करें। –

संबंधित मुद्दे