跳到主要内容
数据处理2026-05-155 分钟阅读

在线 JSONPath 查询工具:从 JSON 数据中提取所需信息

什么是 JSONPath

JSONPath 是一种用于从 JSON 数据结构中提取信息的查询语言,类似于 XML 的 XPath。它使用路径表达式来定位和提取 JSON 中的特定数据——配合 JSON Formatter 先把嵌套结构格式化,查询起来更轻松。

基本语法

表达式说明示例
$根节点$
.子节点$.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[(@.length-1)]最后一本书(脚本形式,见下方陷阱)
$.store.books[?(@.price<85)]价格低于85的书
$.store.books[?(@.category=='前端')].title前端类书籍名
$.store..price所有价格
$.store.books.length()书籍数量(仅部分实现支持)

注意:[-1] 负下标在 jsonpath-plus(本工具引擎)中静默返回空数组,不会报错。取最后一个元素请使用脚本表达式 [(@.length-1)]。length() 函数在 jsonpath-plus 中同样不受支持,不同方言差异很大——详见下文「五大特性」。

如何使用在线工具

使用 ToolVault 工具匣 的 JSONPath 查询工具:

  1. 粘贴 JSON 数据
  2. 输入 JSONPath 表达式
  3. 实时显示查询结果
  4. 支持语法高亮和错误提示
  5. 空表达式会直接报错,首尾空格/换行自动剔除——减少「明明路径对却返回空」的假阴性

配合 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

特性JSONPathJSON Pointer
语法类 XPath类 URL 路径
过滤✅ 支持条件查询❌ 不支持
通配符✅ 支持❌ 不支持
递归搜索✅ .. 语法❌ 不支持
标准社区标准RFC 6901
适用场景复杂查询简单定位

五大特性:实现之间各说各话

JSONPath 无规范性 spec——实现间分歧点:方括号 vs 点号访问特殊字符键(都合法、一个常坏);过滤器(?(@.price < 10)——比较运算符和正则支持差异巨大,jsonpath-plus 里正则要用 @.name.match(/re/i) 而不是 =~);深浅通配符;负索引切片(jsonpath-plus 的 [-1] 静默空匹配,要改写为 [(@.length-1)]);联合下标。实用规则:核心路径(点导航、简单通配、单下标)处处可用;过滤器和联合是方言。「tester 里能用生产不行」= 两个方言——先报实现名(Jayway、Goessner、jsonpath-plus)再抄查询。

过滤器进阶与调试技巧

大家先学的 ?(@.price < 10) 只是皮毛:存在性检查(?(@.discount)——有这个字段)、嵌套路径过滤(?(@.address.city == "北京"))、布尔组合。值得内化的模式:过滤器在路径上下文内生效——$.orders[?(@.paid)] 过滤订单,后接 .items 进入幸存者内部。过滤器返回空时的调试技巧:先去掉过滤器跑路径——前结果就空的话,bug 在导航不在谓词。

为什么你的查询返回了空数组

空数组是 JSONPath 最误导人的输出——它同时意味着「路径没匹配到」和「表达式语法在当前方言下被静默吞掉」。排查顺序:

  1. 先跑无过滤的裸路径($.store.books 而不是 $.store.books[?(...)])——裸路径就空,问题在导航;裸路径有值而过滤后空,问题在谓词。
  2. 检查首尾空白:从文档或终端复制表达式时带入的空格、换行,会让部分引擎静默空匹配。本工具已自动剔除首尾空白,但在代码里调用库时要自己 trim。
  3. 核对方言特性:[-1]、length()、=~ 在 jsonpath-plus 里都是静默失败或抛错的重灾区;换库前先跑一遍最小用例。
  4. 用生成器反向验证:在 JSONPath 生成器 里点选目标节点,比对生成路径与你手写的差异——结构与拼写问题一眼可见。

JSONPath、jq、SQL:选查询工具

JSONPath 做选择(返回子树——API 响应提取与测试断言的完美工具);jq 做变换(管道、重构、算术——一门也做选择的编程语言);SQL 做查询(索引、连接、聚合——JSON 装进库之后)。人人的升级路径:测试里的 JSONPath → shell 管线里的 jq → 数据大到文件装不下时的 SQL。要避免的是直接跳到终点:SQL 里每行 JSON_EXTRACT(无索引、全表扫)做一次性分析比同文件的 jq 慢。

FAQ

JSONPath 有标准吗?

JSONPath 目前没有正式的 RFC 标准,但有一个广泛接受的社区标准。不同语言的实现可能有细微差异,但核心语法是一致的。

如何处理 JSONPath 中的中文?

JSONPath 表达式本身支持 Unicode,可以直接使用中文键名:$.data['中文键名']。但建议 JSON 键名使用英文,避免编码问题。

JSONPath 查询性能如何?

对于大型 JSON 数据,JSONPath 查询性能取决于表达式复杂度和数据结构。简单路径查询(如 $.data[0].name)性能很好。递归搜索(..)在深层嵌套数据上可能较慢。建议在应用层缓存查询结果。

表达式明明写对了,为什么返回空?

最常见的三个原因:表达式首尾带了空格或换行(本工具已自动剔除);路径与 JSON 实际结构不符(用 JSONPath 生成器 点选验证);使用了当前方言不支持的语法(例如 jsonpath-plus 不支持 [-1] 负下标,请改用 [(@.length-1)])。空表达式会直接报错,不会再静默返回空数组。

排查注记

「为什么你的查询返回了空数组」排在教程主体之后,因为空数组是 JSONPath 最误导人的输出——它同时意味着「路径没匹配到」和「表达式语法被当前方言静默吞掉」。排查第一步设计成先跑无过滤的裸路径:裸路径就空、bug 在导航;裸路径有值而过滤后空、问题在谓词——一步把问题域切半。方言一节的规则很实用:「tester 里能用生产不行」就是撞上两个方言,先报实现名(Jayway、Goessner、jsonpath-plus)再抄查询;工具的自动 trim 和空表达式直接报错,也都是冲着减少「明明路径对却返回空」的假阴性去的。


本文出自 ToolVault 工具匣。首页 汇集了更多浏览器本地工具。