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

常用语法和操作符总结

  1. 点符号(.:用于访问对象的属性。

    • 示例:store.book
  2. 方括号([]:用于访问数组元素或进行过滤。

    • 示例:
      • employees[0] 获取数组的第一个元素。
      • employees[*].name 获取所有元素的 name 字段。
      • employees[?age > 25] 过滤出 age 大于 25 的元素。
  3. 管道符(|:将一个表达式的结果传递给下一个表达式。

    • 示例:employees | sort_by(@, &age)
  4. 投影:用于将操作应用到数组中的每个元素。

    • 示例:employees[].name
  5. 函数:用于对数据进行转换或处理(取决于具体实现支持的函数)。

    • 常见函数包括:length, sort, max, min 等。
  6. 构造新对象:使用 {} 来创建新的键值对对象。

    • 示例:{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 命令行工具 jpjmespath/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:

posted @ 2024-05-02 16:15  Undefined443  阅读(134)  评论(0编辑  收藏  举报