当前位置: 首页 > article >正文

jmespath用法总结

JMESPath(JSON.MetaExpression Syntax)是一种查询和过滤JSON文档的表达式语言。JMESPath表达式可以提取、转换和计算JSON数据,以便于处理。JMESPath表达式由路径、过滤器和投影器组成,可以非常灵活地操作JSON数据。
下面是JMESPath的一些基本用法和示例:

  1. 获取值

    • 获取数组中的第一个元素:[0]
    • 获取对象中的特定字段:field_name
    {
      "data": {
        "items": ["apple", "banana", "cherry"]
      }
    }
    
    data.items[0]
    

    返回:"apple"

  2. 条件过滤

    • 获取数组中所有值大于某个值的元素:[?field_name > value]
    {
      "data": {
        "numbers": [1, 2, 3, 4, 5]
      }
    }
    
    data.numbers[? > 3]
    

    返回:[4, 5]

  3. 投影

    • 投影对象数组中的特定字段:[].field_name
    {
      "data": {
        "people": [
          {"name": "Alice", "age": 25},
          {"name": "Bob", "age": 30}
        ]
      }
    }
    
    data.people[].[name]
    

    返回:["Alice", "Bob"]

  4. 组合

    • 组合多个条件、投影和路径
    {
      "data": {
        "people": [
          {"name": "Alice", "age": 25},
          {"name": "Bob", "age": 30},
          {"name": "Charlie", "age": 25}
        ]
      }
    }
    
    data.people[?age == 25].[name]
    

    返回:["Alice", "Charlie"]

  5. 函数

    • 使用JMESPath内置函数进行计算或操作
    {
      "data": {
        "numbers": [1, 2, 3, 4, 5]
      }
    }
    
    data.numbers | length(@)
    

    返回:5

  6. 管道

    • 将一个表达式应用于另一个表达式的结果
    {
      "data": {
        "people": [
          {"name": "Alice", "age": 25},
          {"name": "Bob", "age": 30},
          {"name": "Charlie", "age": 25}
        ]
      }
    }
    
    data.people[?age == 25].name | join(", ")
    

    返回:"Alice, Charlie"

  7. 递归

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

  8. 映射

    • 映射允许你将一个表达式应用于数组中的每个元素。
    {
      "data": {
        "numbers": [1, 2, 3, 4, 5]
      }
    }
    
    data.numbers | map(@ * 2)
    

    返回:[2, 4, 6, 8, 10]

  9. 排序

    • 可以根据特定字段对数组进行排序。
    {
      "data": {
        "people": [
          {"name": "Bob", "age": 30},
          {"name": "Alice", "age": 25}
        ]
      }
    }
    
    data.people | sort_by(@, &age)
    

    返回:[{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]

  10. 切片

    • 可以使用切片语法来获取数组的一部分。
    {
      "data": {
        "items": ["apple", "banana", "cherry", "date", "fig"]
      }
    }
    
    data.items[1:4]
    

    返回:["banana", "cherry", "date"]

  11. 合并

    • 可以合并多个数组或对象。
    {
      "data": {
        "items1": ["apple", "banana"],
        "items2": ["cherry", "date"]
      }
    }
    
    [data.items1, data.items2] | flatten(@)
    

    返回:["apple", "banana", "cherry", "date"]

  12. 函数链

    • 可以链式调用多个函数来处理数据。
    {
      "data": {
        "numbers": [1, 2, 3, 4, 5]
      }
    }
    
    data.numbers | map(@ * 2) | sort_by(@, &desc) | [0]
    

    返回:10(最大的数)

  13. 类型检查

    • JMESPath 允许你检查值的类型。
    {
      "data": {
        "values": [1, "two", true, null]
      }
    }
    
    data.values[?type(@) == "string"]
    

    返回:["two"]

  14. 多级投影

    • 你可以从嵌套的对象中投影多个级别。
    {
      "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"]]

  15. 递归投影

    • JMESPath 允许你递归地投影嵌套结构。
    {
      "data": {
        "people": [
          {
            "name": "Alice",
            "children": [
              {
                "name": "Diana",
                "children": [
                  {
                    "name": "Eve"
                  }
                ]
              }
            ]
          }
        ]
      }
    }
    
    data.people[].[name, children[].[name, children[].[name]]]
    

    返回:[["Alice", ["Diana", ["Eve"]]]]

  16. 比较运算符

    • JMESPath 支持多种比较运算符,如 ==, !=, >, <, >=, <=
    {
      "data": {
        "numbers": [1, 2, 3, 4, 5]
      }
    }
    
    data.numbers[?(@ >= 3 && @ <= 5)]
    

    返回:[3, 4, 5]

  17. 逻辑运算符

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

  18. 索引访问

    • 你可以使用 [] 运算符来访问对象的键或数组的索引。
    {
      "data": {
        "people": [
          {"name": "Alice", "age": 25},
          {"name": "Bob", "age": 30}
        ]
      }
    }
    
    data.people[0].name
    

    返回:"Alice"

  19. 更新和添加

    • 你可以使用 setadd 函数来更新或添加数据。
    {
      "data": {
        "people": [
          {"name": "Alice", "age": 25},
          {"name": "Bob", "age": 30}
        ]
      }
    }
    
    data.people[0].set(age, 26)
    

    返回:[{"name": "Alice", "age": 26}, {"name": "Bob", "age": 30}]

  20. 删除

    • 你可以使用 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"}}]


http://www.kler.cn/a/283421.html

相关文章:

  • 物理设备命名规则(Linux网络服务器 15)
  • 运行WHTools批量启动游戏房间工具提示要安装.Net Framework3.5解决
  • 单例模式详解:如何优雅地实现线程安全的单例
  • Vue常用加密方式
  • C指针创建三维数组
  • 云防护单节点2T抗攻击能力意味着什么?
  • 如何用GPT进行编程辅助?
  • MM 2024 Oral: 大模型带你鉴赏世界名画!同济大学发布
  • 202408830配置WIN11自带的画图程序的画布为4K分辨率
  • 探索 HarmonyOS 中的高级文本自定义
  • Python自动化测试requests库深度详解
  • 实战OpenCV之绘制图形
  • [000-01-015].第03节:SpringBoot中数据源的自动配置
  • 项目环境依赖库导出-python
  • 【Docker】搭建docker的私有仓库
  • centos yum 源停用整改
  • 获取服务器时间
  • 【jvm】局部变量表
  • 轻量级冠军:NVIDIA 发布具有领先准确率的小语言模型
  • Java Excel转PDF(免费)
  • 替换后的最长重复字符(LeetCode)
  • 网络编程(1)
  • 【重点】人工智能大语言模型技术发展研究报告2024|附下载
  • mac安装vue3成功步骤
  • STM32F1+HAL库+FreeTOTS学习7——列表和列表项
  • 养老小程序源码家政服务小程序开发方案