2015-05-24 13 views
5

Dưới đây là json tôi:Trong Python, sử dụng jsonpath-rw để có được giá trị cho thuộc tính cụ thể (json/dict)

{ 
    'test': [ 
     { "id": "1", "description": "Test 1" }, 
     { "id": "2", "description": "Test 2" } 
    ] 
} 

Tôi đang cố gắng để có được giá trị cho id nơi mô tả là " Kiểm tra 1 ".

tôi thấy ví dụ sau đây trên trang JsonPath:

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

Khi cố gắng để phân tích sự biểu hiện jsonxpath sau:

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

tôi nhận được lỗi sau:

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

Tôi đang làm gì sai? Ngoài ra, có cách nào tốt hơn để làm điều này không?

+3

Lạ lùng thay, nhìn vào [code lexer] (https://github.com/kennknowles/python-jsonpath-rw/blob/master/jsonpath_rw/lexer.py), jsonpath-rw không xuất hiện để hỗ trợ cơ chế lọc '? (boolean)'. – voithos

Trả lời

7

Dường như jsonpath-rw không hỗ trợ tính năng này. Có lẽ xem xét một thư viện khác? ObjectPath trông đầy hứa hẹn:

>>> 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"] 

Nó không hoàn toàn làm theo cú pháp JsonPath chính xác, nhưng nó khá giống nhau, ít nhất là từ một cuộc khảo sát chiếu lệ. Documentation cũng có sẵn. Tất nhiên, nếu JSON của bạn sẽ luôn ở trong cùng một hình thức (tức là bạn sẽ không phải đối phó với các đối tượng con bị thiếu, vv), thì bạn có thể dễ dàng thực hiện cùng một truy vấn bằng cách sử dụng một danh sách hiểu, hoặc một cái gì đó tương tự .

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

Chỉ cần nhớ rằng toán tử '..' (tìm kiếm đệ quy/tìm kiếm sâu) rất chậm. Sử dụng '.' nếu bạn chắc chắn rằng kiểm tra nằm trong thư mục gốc của tài liệu và chỉ trong thư mục gốc của tài liệu. –

Các vấn đề liên quan