JSONPath使用案例讲解

发布于:2025-02-11 ⋅ 阅读:(53) ⋅ 点赞:(0)

JSONPath 是一种用于查询和提取 JSON 数据的语言,它类似于 XPath,主要用于解析和提取 JSON 文档中的特定数据。以下是一些常见的实际使用场景,并结合这些场景给出 JSONPath 的使用说明。

1. 提取指定字段的值

场景:

你有一个 JSON 数据,表示一名学生的成绩单,想要提取学生的名字和数学成绩。

{
  "student": {
    "name": "John Doe",
    "age": 20,
    "scores": {
      "math": 85,
      "english": 90
    }
  }
}
JSONPath 表达式:
  • 提取学生的名字: $.student.name
  • 提取数学成绩: $.student.scores.math
说明:
  • $.student.name 会返回 "John Doe"
  • $.student.scores.math 会返回 85

2. 提取数组中的元素

场景:

你有一个 JSON 数据表示多个学生及其成绩,想要提取所有学生的数学成绩。

{
  "students": [
    {"name": "John Doe", "scores": {"math": 85, "english": 90}},
    {"name": "Jane Smith", "scores": {"math": 92, "english": 88}},
    {"name": "Mike Johnson", "scores": {"math": 78, "english": 85}}
  ]
}
JSONPath 表达式:
  • 提取所有学生的数学成绩: $.students[*].scores.math
说明:
  • [*] 用于选择数组中的所有元素。
  • 该表达式返回 [85, 92, 78],即所有学生的数学成绩。

3. 提取嵌套数组中的特定元素

场景:

你有一个 JSON 数据表示订单信息,想要提取所有订单中价格大于 50 的商品名称。

{
  "orders": [
    {
      "orderId": "001",
      "items": [
        {"name": "item1", "price": 45},
        {"name": "item2", "price": 55}
      ]
    },
    {
      "orderId": "002",
      "items": [
        {"name": "item3", "price": 60},
        {"name": "item4", "price": 30}
      ]
    }
  ]
}
JSONPath 表达式:
  • 提取价格大于 50 的商品名称: $.orders[*].items[?(@.price > 50)].name
说明:
  • ?(@.price > 50) 是一个过滤器,表示只选择价格大于 50 的商品。
  • 该表达式返回 ["item2", "item3"],即符合条件的商品名称。

4. 提取嵌套对象中的某些属性

场景:

你有一个 JSON 数据表示图书信息,想要提取所有书名和出版年份。

{
  "library": {
    "books": [
      {"title": "Book A", "author": "Author A", "year": 2020},
      {"title": "Book B", "author": "Author B", "year": 2019},
      {"title": "Book C", "author": "Author C", "year": 2021}
    ]
  }
}
JSONPath 表达式:
  • 提取所有书名和出版年份: $.library.books[*]['title', 'year']
说明:
  • ['title', 'year'] 用来选择多个属性。
  • 该表达式返回 [{"title": "Book A", "year": 2020}, {"title": "Book B", "year": 2019}, {"title": "Book C", "year": 2021}],即每本书的标题和出版年份。

5. 获取对象中不存在的字段

场景:

你有一个 JSON 数据表示一个用户的基本信息,想要提取所有字段,包括用户没有提供的字段(即值为 null 的字段)。

{
  "user": {
    "name": "Alice",
    "email": null,
    "phone": "123-456-7890"
  }
}
JSONPath 表达式:
  • 提取所有字段: $.user.*
说明:
  • * 用于选择对象中的所有字段。
  • 该表达式返回 [ "Alice", null, "123-456-7890" ],即所有字段的值,包括 null

6. 提取数组中的部分元素

场景:

你有一个 JSON 数组表示多个用户的信息,想要提取前两个用户的名字。

{
  "users": [
    {"name": "John", "age": 30},
    {"name": "Jane", "age": 25},
    {"name": "Doe", "age": 22}
  ]
}
JSONPath 表达式:
  • 提取前两个用户的名字: $.users[0,1].name
说明:
  • [0,1] 用来选择数组中的第一个和第二个元素。
  • 该表达式返回 ["John", "Jane"],即前两个用户的名字。

7. 提取数组元素的部分

场景:

你有一个 JSON 数组表示多个订单,想要提取所有订单的前两项。

{
  "orders": [
    {"orderId": "001", "amount": 100},
    {"orderId": "002", "amount": 150},
    {"orderId": "003", "amount": 200}
  ]
}
JSONPath 表达式:
  • 提取前两项订单: $.orders[0:2]
说明:
  • [0:2] 表示提取数组中的前两项(索引 0 和 1)。
  • 该表达式返回 [ {"orderId": "001", "amount": 100}, {"orderId": "002", "amount": 150} ]

8. 使用递归 descent(递归下降)

场景:

你有一个嵌套的 JSON 数据,想要查找所有的 name 字段,不管它们处于什么层级。

{
  "company": {
    "department": {
      "name": "Engineering",
      "members": [
        {"name": "John", "role": "Developer"},
        {"name": "Jane", "role": "Manager"}
      ]
    },
    "department": {
      "name": "Marketing",
      "members": [
        {"name": "Doe", "role": "Analyst"},
        {"name": "Alice", "role": "Head"}
      ]
    }
  }
}
JSONPath 表达式:
  • 查找所有 name 字段: $.company..name
说明:
  • .. 是递归下降运算符,它会递归地查询所有层级中的 name 字段。
  • 该表达式返回 ["Engineering", "John", "Jane", "Marketing", "Doe", "Alice"],即所有层级中的 name 字段的值。

总结

JSONPath 提供了一种强大的方式来从 JSON 数据中查询和提取特定的信息。它能够支持从简单的字段提取到复杂的嵌套结构、过滤和递归查询等功能,适用于在处理和分析大量 JSON 数据时的各种需求。


网站公告

今日签到

点亮在社区的每一天
去签到