2015-05-24 3 views
5

Вот мой JSON:В Python, используя jsonpath-RW, чтобы получить значения для конкретного атрибута (JSON/Dict)

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

Я пытаюсь получить значение для ид где описание является " Тест 1 ".

я нашел следующий пример на странице JsonPath:

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

При попытке разобрать следующее jsonxpath выражение:

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

Я получаю следующее сообщение об ошибке:

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

Что я делаю не так? Альтернативно, есть ли лучший способ сделать это?

+3

Как ни странно, глядя на [код лексического анализатора] (https://github.com/kennknowles/python-jsonpath-rw/blob/master/jsonpath_rw/lexer.py), jsonpath-RW не похоже, вообще поддерживают механизм фильтрации?? (логический)? – 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

Просто имейте в виду, что оператор '..' (рекурсивный спуск/глубокий поиск) очень медленный. Используйте '.', Если вы уверены, что тест находится в корневом каталоге документа и только в корневом каталоге документа. –

 Смежные вопросы

  • Нет связанных вопросов^_^