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"}}]