В Python, используя jsonpath-rw для получения значений для определенного атрибута (json/dict)

вот мой json:

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

Я пытаюсь получить значение id здесь описание - "тест 1".

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

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

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

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

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

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

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

1 ответов


получается, что 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, но он очень похож, по крайней мере, из поверхностного опроса. документация также доступна.

конечно, если ваш JSON всегда будет в той же форме (т. е. вам не придется иметь дело с отсутствующими дочерними объектами и т. д.), то вы можете легко сделать тот же запрос, используя понимание списка, или что-то подобное.

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