Skip to content
data2026-07-252 分钟阅读

什么是 JSONPath

JSONPath 是一种用于从 JSON 数据结构中提取信息的查询语言,类似于 XML 的 XPath。它使用路径表达式来定位和提取 JSON 中的特定数据。

基本语法

| 表达式 | 说明 | 示例 | |--------|------|------| | $ | 根节点 | $ | | . | 子节点 | $.name | | [] | 子节点/过滤 | $['name'] | | * | 通配符 | $.* | | .. | 递归搜索 | $..name | | @ | 当前节点 | $.users[?(@.age>25)] |

为什么需要 JSONPath

  1. API 数据提取:从复杂的 API 响应中精确提取需要的字段
  2. 数据转换:从嵌套 JSON 中提取数据并重组
  3. 日志分析:从结构化日志中筛选特定信息
  4. 配置管理:从多层配置文件中读取特定值
  5. 测试断言:API 测试中验证特定字段值
  6. 数据迁移:在不同数据结构间映射字段

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 查询工具

  1. 粘贴 JSON 数据
  2. 输入 JSONPath 表达式
  3. 实时显示查询结果
  4. 支持语法高亮和错误提示
  5. 内置常用表达式模板

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 提供。更多开发者工具请访问 首页


ad