在Python中,使用jsonpath-rw获取特定属性的值(json/dict)

Pav*_*kov 8 python jsonpath

这是我的json:

{
   'test': [
        { "id": "1", "description": "Test 1" },
        { "id": "2", "description": "Test 2" }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取id的值,其中描述为"Test 1".

我在JsonPath页面上找到了以下示例:

$..book[?(@.price<10)]
Run Code Online (Sandbox Code Playgroud)

尝试解析以下jsonxpath表达式时:

parse('$..test[?(@.description="Test 1")].id')
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

jsonpath_rw.lexer.JsonPathLexerError: Error on line 1, col 7: Unexpected character: ?
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?或者,有更好的方法吗?

voi*_*hos 8

它似乎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"]
Run Code Online (Sandbox Code Playgroud)

它并不完全遵循JsonPath语法,但它非常相似,至少从敷衍调查来看.文档也可用.

当然,如果您的JSON将始终采用相同的形式(即您不必处理丢失的子对象等),那么您可以使用列表推导或类似的东西轻松地执行相同的查询.

json = { ... }
ids = [t['id'] for t in json['test'] if t['description'] == 'Test 1']
Run Code Online (Sandbox Code Playgroud)

  • 请记住,`..`运算符(递归下降/深度搜索)非常慢。如果您确定测试在文档的根目录中并且仅在文档的根目录中,请使用`.`。 (2认同)