JSON匹配表达式
项目描述
JMESPath
JMESPath(发音为“jaymz path”)允许您声明性地指定如何从JSON文档中提取元素。
例如,给定此文档
{"foo": {"bar": "baz"}}
该jmespath表达式 foo.bar 将返回“baz”。
JMESPath还支持
引用列表中的元素。给定以下数据
{"foo": {"bar": ["one", "two"]}}
表达式: foo.bar[0] 将返回“one”。您还可以使用 * 语法引用列表中的所有项
{"foo": {"bar": [{"name": "one"}, {"name": "two"}]}}
表达式: foo.bar[*].name 将返回 [“one”, “two”]。负索引也受支持(-1 表示列表中的最后一个元素)。给定上面的数据,表达式 foo.bar[-1].name 将返回 [“two”]。
也可以使用 * 对象类型
{"foo": {"bar": {"name": "one"}, "baz": {"name": "two"}}}
表达式: foo.*.name 将返回 [“one”, “two”]。
注意:jmespath正在积极开发。它目前不支持的一些功能可能会在未来添加。
语法
语法使用ABNF指定,如RFC4234中所述
expression = sub-expression / index-expression / or-expression / identifier / "*" sub-expression = expression "." expression or-expression = expression "||" expression index-expression = expression bracket-specifier / bracket-specifier bracket-specifier = "[" (number / "*") "]" number = [-]1*digit digit = "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" / "0" identifier = 1*char char = unescaped / escape ( %x20-2F / ; Space,!,",#,$,%,&,',(,),*,+,comma,-,.,/ %x3A-40 / ; :,;,<,=,>,?,@ %x5B / ; Left bracket: [ %x5C / ; Back slash: \ %x5D / ; Right bracket: ] %x5E / ; Caret: ^ %x60 / ; Backtick: ` %x7B-7E / ; {,|,},~ b / ; backspace n / ; new line f / ; form feed r / ; carriage return t ) ; tab escape = %x5C ; Back slash: \ unescaped = %x30-39 / %x41-5A / %x5F / %x61-7A / %x7F-10FFFF
测试
除了jmespath模块的单元测试外,还有一个 tests/compliance 目录,其中包含包含测试用例的.json文件。这允许其他实现验证它们是否产生正确的输出。每个json文件都按功能分组。
Python库
包含的Python实现有两个操作在Python数据结构上的便利函数。您可以使用 search 并给它jmespath表达式和数据
>>> import jmespath >>> path = jmespath.search('foo.bar', {'foo': {'bar': 'baz'}}) 'baz'
类似于 re 模块,您可以将编译的表达式存储并重复使用以执行重复搜索
>>> import jmespath >>> path = jmespath.compile('foo.bar') >>> path.search({'foo': {'bar': 'baz'}}) 'baz' >>> path.search({'foo': {'bar': 'other'}}) 'other'
如果需要更多控制,您还可以直接使用 jmespath.parser.Parser 类。