jmespath用法总结
JMESPath(JSON.MetaExpression Syntax)是一种查询和过滤JSON文档的表达式语言。JMESPath表达式可以提取、转换和计算JSON数据,以便于处理。JMESPath表达式由路径、过滤器和投影器组成,可以非常灵活地操作JSON数据。
下面是JMESPath的一些基本用法和示例:
-
获取值:
- 获取数组中的第一个元素:
[0] - 获取对象中的特定字段:
field_name
{"data": {"items": ["apple", "banana", "cherry"]} }data.items[0]返回:
"apple" - 获取数组中的第一个元素:
-
条件过滤:
- 获取数组中所有值大于某个值的元素:
[?field_name > value]
{"data": {"numbers": [1, 2, 3, 4, 5]} }data.numbers[? > 3]返回:
[4, 5] - 获取数组中所有值大于某个值的元素:
-
投影:
- 投影对象数组中的特定字段:
[].field_name
{"data": {"people": [{"name": "Alice", "age": 25},{"name": "Bob", "age": 30}]} }data.people[].[name]返回:
["Alice", "Bob"] - 投影对象数组中的特定字段:
-
组合:
- 组合多个条件、投影和路径
{"data": {"people": [{"name": "Alice", "age": 25},{"name": "Bob", "age": 30},{"name": "Charlie", "age": 25}]} }data.people[?age == 25].[name]返回:
["Alice", "Charlie"] -
函数:
- 使用JMESPath内置函数进行计算或操作
{"data": {"numbers": [1, 2, 3, 4, 5]} }data.numbers | length(@)返回:
5 -
管道:
- 将一个表达式应用于另一个表达式的结果
{"data": {"people": [{"name": "Alice", "age": 25},{"name": "Bob", "age": 30},{"name": "Charlie", "age": 25}]} }data.people[?age == 25].name | join(", ")返回:
"Alice, Charlie" -
递归:
- JMESPath支持递归地处理JSON对象或数组。
{"data": {"people": [{"name": "Alice","age": 25,"children": [{"name": "Diana","age": 5}]},{"name": "Bob","age": 30,"children": [{"name": "Eve","age": 7}]}]} }data.people[].[name, children[].[name]]返回:
[["Alice", ["Diana"]], ["Bob", ["Eve"]]] -
映射:
- 映射允许你将一个表达式应用于数组中的每个元素。
{"data": {"numbers": [1, 2, 3, 4, 5]} }data.numbers | map(@ * 2)返回:
[2, 4, 6, 8, 10] -
排序:
- 可以根据特定字段对数组进行排序。
{"data": {"people": [{"name": "Bob", "age": 30},{"name": "Alice", "age": 25}]} }data.people | sort_by(@, &age)返回:
[{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}] -
切片:
- 可以使用切片语法来获取数组的一部分。
{"data": {"items": ["apple", "banana", "cherry", "date", "fig"]} }data.items[1:4]返回:
["banana", "cherry", "date"] -
合并:
- 可以合并多个数组或对象。
{"data": {"items1": ["apple", "banana"],"items2": ["cherry", "date"]} }[data.items1, data.items2] | flatten(@)返回:
["apple", "banana", "cherry", "date"] -
函数链:
- 可以链式调用多个函数来处理数据。
{"data": {"numbers": [1, 2, 3, 4, 5]} }data.numbers | map(@ * 2) | sort_by(@, &desc) | [0]返回:
10(最大的数)
、 -
类型检查:
- JMESPath 允许你检查值的类型。
{"data": {"values": [1, "two", true, null]} }data.values[?type(@) == "string"]返回:
["two"] -
多级投影:
- 你可以从嵌套的对象中投影多个级别。
{"data": {"people": [{"name": "Alice","address": {"street": "123 Main St","city": "Wonderland"}},{"name": "Bob","address": {"street": "456 Elm St","city": "Builderland"}}]} }data.people[].[name, address.city]返回:
[["Alice", "Wonderland"], ["Bob", "Builderland"]] -
递归投影:
- JMESPath 允许你递归地投影嵌套结构。
{"data": {"people": [{"name": "Alice","children": [{"name": "Diana","children": [{"name": "Eve"}]}]}]} }data.people[].[name, children[].[name, children[].[name]]]返回:
[["Alice", ["Diana", ["Eve"]]]] -
比较运算符:
- JMESPath 支持多种比较运算符,如
==,!=,>,<,>=,<=。
{"data": {"numbers": [1, 2, 3, 4, 5]} }data.numbers[?(@ >= 3 && @ <= 5)]返回:
[3, 4, 5] - JMESPath 支持多种比较运算符,如
-
逻辑运算符:
- JMESPath 支持逻辑运算符,如
and,or,not。
{"data": {"people": [{"name": "Alice", "age": 25},{"name": "Bob", "age": 30},{"name": "Charlie", "age": 35}]} }data.people[?(age > 25 and age < 35)]返回:
[{"name": "Alice", "age": 25}] - JMESPath 支持逻辑运算符,如
-
索引访问:
- 你可以使用
[]运算符来访问对象的键或数组的索引。
{"data": {"people": [{"name": "Alice", "age": 25},{"name": "Bob", "age": 30}]} }data.people[0].name返回:
"Alice" - 你可以使用
-
更新和添加:
- 你可以使用
set和add函数来更新或添加数据。
{"data": {"people": [{"name": "Alice", "age": 25},{"name": "Bob", "age": 30}]} }data.people[0].set(age, 26)返回:
[{"name": "Alice", "age": 26}, {"name": "Bob", "age": 30}] - 你可以使用
-
删除:
- 你可以使用
del函数来删除数据。
{"data": {"people": [{"name": "Alice", "age": 25},{"name": "Bob", "age": 30}]} }data.people[0].del(age)返回:
[{"name": "Alice"}, {"name": "Bob", "age": 30}] - 你可以使用
JMESPath 提供了丰富的功能来处理 JSON 数据,以下是一些额外的用法和示例:
21. 聚合函数:
- JMESPath 支持聚合函数,如 sum, min, max, avg 等。
json { "data": { "numbers": [1, 2, 3, 4, 5] } }
jmespath data.numbers | sum(@)
返回:15
22. 搜索函数:
- JMESPath 支持搜索函数,如 search, contains, startswith, endswith 等。
json { "data": { "strings": ["apple", "banana", "cherry"] } }
jmespath data.strings[?contains(@, "a")]
返回:["apple", "banana"]
23. 正则表达式:
- JMESPath 允许你使用正则表达式进行匹配。
json { "data": { "strings": ["apple", "banana", "cherry", "grape"] } }
jmespath data.strings[?regex(@, "^[a-g].*")]
返回:["apple", "banana", "cherry", "grape"]
24. 路径引用:
- 你可以使用 .. 来引用父级或根级的值。
json { "data": { "people": [ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 30} ] } }
jmespath data.people[].[name, ..age]
返回:[["Alice", 25], ["Bob", 30]]
25. 递归搜索:
- JMESPath 允许你递归地搜索对象或数组。
json { "data": { "people": [ { "name": "Alice", "children": [ { "name": "Diana", "children": [ { "name": "Eve" } ] } ] } ] } }
jmespath data..name
返回:["Alice", "Diana", "Eve"]
26. 自定义函数:
- JMESPath 允许你定义自定义函数来扩展其功能。
json { "data": { "numbers": [1, 2, 3, 4, 5] } }
jmespath def add(a, b) a + b data.numbers | map(@ | add(@, 10))
返回:[11, 12, 13, 14, 15]
27. 条件表达式:
- JMESPath 支持条件表达式,类似于 Python 中的三元表达式。
json { "data": { "people": [ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 30} ] } }
jmespath data.people[].[name, age > 25 ? "Older" : "Younger"]
返回:[["Alice", "Younger"], ["Bob", "Older"]]
28. 多级键访问:
- 你可以使用 .. 来访问多级键。
json { "data": { "people": [ {"name": "Alice", "address": {"street": "123 Main St", "city": "Wonderland"}} ] } }
jmespath data.people[].[name, ..street]
返回:[["Alice", "123 Main St"]]
29. 更新嵌套结构:
- 你可以使用 set 函数来更新嵌套结构。
json { "data": { "people": [ {"name": "Alice", "address": {"street": "123 Main St", "city": "Wonderland"}} ] } }
jmespath data.people[0].address.set(city, "Builderland")
返回:[{"name": "Alice", "address": {"street": "123 Main St", "city": "Builderland"}}]
