JMESPath 使用
最近在学习使用 AWS CLI,经常要用到 query 功能。AWS CLI 使用的查询语法是 JMESPath,因此特地在这里记录常用的 JMESPath 语法。
JMESPath 是一种查询语言,专门用于处理 JSON 对象。
使用案例
基本查询
JSON 数据:
{
"employees": [
{"name": "John", "age": 30, "department": "Sales"},
{"name": "Jane", "age": 25, "department": "Marketing"},
{"name": "Doe", "age": 28, "department": "Development"}
],
"company": "TechCorp"
}
获取所有员工的姓名列表:
employees[].name
解释:
employees
:访问顶层的employees
数组。[]
:表示遍历数组中的每个元素。name
:提取每个元素中的name
字段。
结果:
["John", "Jane", "Doe"]
嵌套查询
JSON 数据:
{
"store": {
"book": [
{"category": "reference", "title": "JavaScript: The Good Parts", "price": 25.00},
{"category": "fiction", "title": "The Lord of the Rings", "price": 20.00},
{"category": "fiction", "title": "Harry Potter", "price": 22.50}
],
"bicycle": {"color": "red", "price": 19.95}
}
}
获取所有价格低于 22 的书籍标题:
store.book[?price < `22`].title
解释:
store.book
:访问store
下的book
数组。[?price < `22`]
:过滤出price
小于 22 的书籍。title
:提取符合条件的书籍的title
字段。
结果:
["The Lord of the Rings"]
使用管道和函数
JSON 数据:
{
"users": [
{"id": 1, "name": "Alice", "email": "alice@example.com"},
{"id": 2, "name": "Bob", "email": "bob@example.com"},
{"id": 3, "name": "Charlie", "email": "charlie@example.com"}
]
}
获取所有用户的电子邮件地址,并按字母排序:
users[].email | sort(@)
解释:
users[].email
:提取所有用户的email
字段。| sort(@)
:对提取的电子邮件列表进行排序。
结果:
[
"alice@example.com",
"bob@example.com",
"charlie@example.com"
]
递归搜索
JSON 数据:
{
"departments": [
{
"name": "Engineering",
"teams": [
{"name": "Backend", "members": 10},
{"name": "Frontend", "members": 8}
]
},
{
"name": "HR",
"teams": [
{"name": "Recruitment", "members": 5},
{"name": "Employee Relations", "members": 3}
]
}
]
}
获取所有团队的名称:
departments[].teams[].name
解释:
departments[]
:遍历departments
数组中的每个部门。teams[]
:遍历每个部门中的teams
数组。name
:提取每个团队的name
字段。
结果:
[
"Backend",
"Frontend",
"Recruitment",
"Employee Relations"
]
常用语法和操作符总结
-
点符号(
.
):用于访问对象的属性。- 示例:
store.book
- 示例:
-
方括号(
[]
):用于访问数组元素或进行过滤。- 示例:
employees[0]
获取数组的第一个元素。employees[*].name
获取所有元素的name
字段。employees[?age >
25]
过滤出age
大于 25 的元素。
- 示例:
-
管道符(
|
):将一个表达式的结果传递给下一个表达式。- 示例:
employees | sort_by(@, &age)
- 示例:
-
投影:用于将操作应用到数组中的每个元素。
- 示例:
employees[].name
- 示例:
-
函数:用于对数据进行转换或处理(取决于具体实现支持的函数)。
- 常见函数包括:
length
,sort
,max
,min
等。
- 常见函数包括:
-
构造新对象:使用
{}
来创建新的键值对对象。- 示例:
{Name: name, Age: age}
- 示例:
工具推荐
-
JMESPath 在线试验工具:你可以访问 JMESPath Tester 在线编写和测试你的表达式。
-
Python 库:安装 jmespath 库(jmespath/jmespath.py),可以在 Python 或终端中使用 JMESPath 查询 JSON 数据。
在终端中使用 jmespath 库:
pipx install jmespath jp.py -f data.json 'employees[].name'
-
命令行工具:安装 JMESPath 命令行工具
jp
(jmespath/jp),可以在终端中使用 JMESPath 查询 JSON 数据。brew install jmespath/jmespath/jp
使用示例:
echo '{"employees": [{"name": "John"}, {"name": "Jane"}]}' | jp 'employees[].name'
jp -f data.json 'employees[].name'
更多 JMESPath 库可以参见:JMESPath Libraries | JMESPath
See also: