什么是 JSONPath
JSONPath 是一种用于从 JSON 数据结构中提取信息的查询语言,类似于 XML 的 XPath。它使用路径表达式来定位和提取 JSON 中的特定数据。
基本语法
| 表达式 | 说明 | 示例 |
|--------|------|------|
| $ | 根节点 | $ |
| . | 子节点 | $.name |
| [] | 子节点/过滤 | $['name'] |
| * | 通配符 | $.* |
| .. | 递归搜索 | $..name |
| @ | 当前节点 | $.users[?(@.age>25)] |
为什么需要 JSONPath
- API 数据提取:从复杂的 API 响应中精确提取需要的字段
- 数据转换:从嵌套 JSON 中提取数据并重组
- 日志分析:从结构化日志中筛选特定信息
- 配置管理:从多层配置文件中读取特定值
- 测试断言:API 测试中验证特定字段值
- 数据迁移:在不同数据结构间映射字段
JSONPath 表达式详解
示例 JSON 数据
{
"store": {
"books": [
{ "title": "JavaScript 权威指南", "price": 99, "category": "编程" },
{ "title": "CSS 揭秘", "price": 79, "category": "前端" },
{ "title": "HTTP 权威指南", "price": 89, "category": "网络" }
],
"bicycle": { "color": "red", "price": 299 }
}
}
常用表达式
| JSONPath | 结果 |
|----------|------|
| $.store.books[*].title | 所有书名 |
| $.store.books[0] | 第一本书 |
| $.store.books[-1] | 最后一本书 |
| $.store.books[?(@.price<85)] | 价格低于85的书 |
| $.store.books[?(@.category=='前端')].title | 前端类书籍名 |
| $.store..price | 所有价格 |
| $.store.books.length() | 书籍数量 |
如何使用在线工具
使用 DevToolkit Pro 的 JSONPath 查询工具:
- 粘贴 JSON 数据
- 输入 JSONPath 表达式
- 实时显示查询结果
- 支持语法高亮和错误提示
- 内置常用表达式模板
JSONPath 在代码中的使用
JavaScript
// 简单的 JSONPath 实现
function jsonPath(obj, path) {
const keys = path.replace(/\$/,'').replace(/\[(\d+)\]/g, '.$1').split('.').filter(Boolean);
return keys.reduce((current, key) => current?.[key], obj);
}
// 使用
const data = { store: { books: [{ title: 'JS 权威指南', price: 99 }] } };
const title = jsonPath(data, '$.store.books[0].title'); // 'JS 权威指南'
Python
import jsonpath_ng
def json_path_query(data, expression):
jsonpath_expr = jsonpath_ng.parse(expression)
return [match.value for match in jsonpath_expr.find(data)]
# 使用
data = {"store": {"books": [{"title": "JS 权威指南", "price": 99}]}}
results = json_path_query(data, "$.store.books[*].title")
使用 jsonpath-ng 库(Python)
from jsonpath_ng import parse
expression = parse('$.store.books[?(@.price<90)]')
matches = expression.find(data)
for match in matches:
print(match.value)
JSONPath vs JSON Pointer
| 特性 | JSONPath | JSON Pointer |
|------|----------|-------------|
| 语法 | 类 XPath | 类 URL 路径 |
| 过滤 | ✅ 支持条件查询 | ❌ 不支持 |
| 通配符 | ✅ 支持 | ❌ 不支持 |
| 递归搜索 | ✅ .. 语法 | ❌ 不支持 |
| 标准 | 社区标准 | RFC 6901 |
| 适用场景 | 复杂查询 | 简单定位 |
FAQ
JSONPath 有标准吗?
JSONPath 目前没有正式的 RFC 标准,但有一个广泛接受的社区标准。不同语言的实现可能有细微差异,但核心语法是一致的。
如何处理 JSONPath 中的中文?
JSONPath 表达式本身支持 Unicode,可以直接使用中文键名:$.data['中文键名']。但建议 JSON 键名使用英文,避免编码问题。
JSONPath 查询性能如何?
对于大型 JSON 数据,JSONPath 查询性能取决于表达式复杂度和数据结构。简单路径查询(如 $.data[0].name)性能很好。递归搜索(..)在深层嵌套数据上可能较慢。建议在应用层缓存查询结果。
本文由 DevToolkit Pro 提供。更多开发者工具请访问 首页。
相关文章
YAML JSON 转换完全指南:原理、工具与最佳实践
深入理解 YAML 和 JSON 的区别与联系,掌握 YAML JSON 双向转换的各种方法——在线工具、命令行、代码实现,以及常见陷阱和最佳实践。
在线 XML/JSON 转换器:数据格式互转工具
学习如何在 XML 和 JSON 格式之间转换数据。了解 XML 和 JSON 的特点差异,以及在 API 集成、配置管理和数据交换中的应用场景。
在线 Markdown 预览器:实时渲染和编辑 Markdown 文档
学习如何使用在线 Markdown 预览器实时渲染 Markdown 文档。了解 Markdown 语法、GFM 扩展、表格和代码高亮,以及在技术文档中的最佳实践。