博客

JSONPath使用教程:从复杂JSON中提取数据

有时你需要从API响应或大型JSON数据集中提取特定值。与其手动遍历整个数据结构,不如使用JSONPath精确定位并提取所需数据。本教程介绍JSONPath语法和实用使用模式。

什么是JSONPath?

JSONPath是一种用于从JSON数据中选取特定元素的查询语言。它受XML的XPath启发,能够高效地从复杂JSON结构中提取数据。

基本语法

我们将使用以下JSON数据作为示例:

{
"store": {
"books": [
{
"title": "Clean Code",
"author": "Robert C. Martin",
"price": 35.99,
"tags": ["programming", "best-practices"]
},
{
"title": "The Pragmatic Programmer",
"author": "David Thomas",
"price": 49.99,
"tags": ["programming", "career"]
},
{
"title": "Design Patterns",
"author": "Gang of Four",
"price": 54.99,
"tags": ["programming", "architecture"]
}
],
"location": "online"
}
}

根元素:$

每个JSONPath表达式都以 $(根)开头。

表达式结果
$整个JSON文档
$.store完整的store对象
$.store.location"online"

点标记法与括号标记法

$.store.books[0].title → 点标记法
$['store']['books'][0]['title'] → 括号标记法

两者返回相同结果。点标记法更简洁,但当键包含特殊字符或空格时,必须使用括号标记法。

数组访问

表达式说明
$.store.books[0]第一本书
$.store.books[-1]最后一本书
$.store.books[0,2]第一本和第三本书
$.store.books[0:2]索引0-1(切片)

通配符与递归下降

通配符:*

选取所有元素。

$.store.books[*].title
→ ["Clean Code", "The Pragmatic Programmer", "Design Patterns"]
$.store.books[*].price
→ [35.99, 49.99, 54.99]

递归下降:..

在所有深度层级进行搜索。

$..title
→ ["Clean Code", "The Pragmatic Programmer", "Design Patterns"]
$..price
→ [35.99, 49.99, 54.99]

递归下降在你不知道嵌套深度时非常有用,但处理大型数据集时要注意性能问题。

过滤表达式

使用 ?() 语法进行条件选取。

比较运算符

$.store.books[?(@.price > 40)]
→ 价格超过40的书
$.store.books[?(@.price < 50)]
→ 价格低于50的书
$.store.books[?(@.author == "David Thomas")]
→ "David Thomas"著的书

这里,@ 指代当前元素。

逻辑运算符

$.store.books[?(@.price > 40 && @.price < 55)]
→ 价格在40到55之间的书

实际应用示例

从API响应中提取特定字段

从用户列表API中只提取邮箱:

$.users[*].email

在嵌套对象中查找值

从配置文件中提取所有端口号:

$..port

条件数据过滤

只提取活跃用户:

$.users[?(@.status == "active")]

选取数组范围

最近10条日志记录:

$.logs[-10:]

JSONPath与JavaScript对比

任务JavaScriptJSONPath
第一本书的标题data.store.books[0].title$.store.books[0].title
所有价格data.store.books.map(b => b.price)$.store.books[*].price
价格过滤data.store.books.filter(b => b.price > 40)$.store.books[?(@.price > 40)]
所有标题(递归)需要递归函数$..title

JSONPath以声明式方式提取数据,无需编写代码,在调试和数据探索时尤为实用。

技巧与注意事项

  1. 测试路径:使用JSONKit的查询工具实时测试复杂的JSONPath表达式。
  2. 性能..(递归下降)在大型JSON上可能很慢。尽量使用明确的路径。
  3. 实现差异:不同实现之间的JSONPath语法可能略有差异。JSONKit使用 jsonpath-plus 库。
  4. 结果类型:JSONPath结果始终以数组形式返回。即使期望单个值,也需要从数组中提取。

结语

掌握JSONPath能让你从复杂JSON结构中快速精确地提取数据。使用JSONKit的JSONPath查询工具实时测试查询,即时查看结果。