← 返回博客

JSONPath 完全指南:如何查询 JSON 数据

2026-04-15 · 5 分钟阅读

什么是 JSONPath?

JSONPath 是一种查询表达式语言,用于从 JSON 文档中提取特定数据,类似于 XML 的 XPath。JSONPath 表达式允许你用简洁的语法定位 JSON 中的任意元素,无论它嵌套多深或处于什么位置,而无需编写复杂的递归代码。

JSONPath 最初由 Stefan Goessner 在 2007 年提出,目前有 RFC 9535 标准(2024 年正式发布)规范化其语法。它被广泛用于各种工具和系统:jq(命令行 JSON 处理器)、Kubernetes(资源配置查询)、Ansible(配置管理)、各种 API 测试框架等。

JSONPath 基本语法

JSONPath 使用以下基本符号:

$ — 根节点(Root element)
. — 子元素访问符(Child accessor)
.. — 递归下降,搜索所有后代
* — 通配符,匹配所有子元素
[] — 下标操作符(数组索引、属性名、过滤器)
[n] — 访问数组第 n 个元素(0-based)
[*] — 数组所有元素
[start:end] — 数组切片
[?(...)] — 过滤器表达式

实际案例:从 JSON 中提取数据

假设有以下 JSON 数据:

{
  "store": {
    "books": [
      {"title": "The Great Gatsby", "price": 12.99, "category": "fiction"},
      {"title": "Python Crash Course", "price": 29.99, "category": "tech"},
      {"title": "Clean Code", "price": 34.99, "category": "tech"}
    ],
    "owner": "Alice"
  }
}

常用 JSONPath 查询:

$.store.owner          → "Alice"
$.store.books[0].title → "The Great Gatsby"
$.store.books[*].price → [12.99, 29.99, 34.99]
$.store.books[-1].title → "Clean Code"(最后一本)
$..title               → 递归查找所有 title 字段
$.store.books[1:3]     → 第 2、3 本书(切片)

过滤器表达式:条件查询

JSONPath 的过滤器 [?(...)] 允许根据条件筛选数组元素,@ 代表当前元素:

// 价格大于 20 的书
$.store.books[?(@.price > 20)]

// 分类为 tech 的书
$.store.books[?(@.category == 'tech')]

// 价格在 10-30 之间的书
$.store.books[?(@.price >= 10 && @.price <= 30)]

// 有特定字段的元素(字段存在性检查)
$.store.books[?(@.isbn)]

jq 中的 JSONPath 风格查询

jq 有自己的查询语法,与 JSONPath 类似但不完全相同。以下是 jq 中常用的查询示例:

# 提取字段
jq '.store.owner' data.json

# 数组所有元素的字段
jq '.store.books[].title' data.json

# 过滤:价格 > 20
jq '.store.books[] | select(.price > 20)' data.json

# 提取特定字段并重构
jq '.store.books[] | {title, price}' data.json

# 聚合:计算总价
jq '[.store.books[].price] | add' data.json

JavaScript 中使用 JSONPath

JavaScript 没有内置 JSONPath 支持,需要使用第三方库:

// 使用 jsonpath-plus 库
import jsonpath from 'jsonpath-plus';

const results = jsonpath.query(data, '$.store.books[?(@.price > 20)]');
console.log(results);

// 使用 @jsonpath/jsonpath-ts(TypeScript 友好)
import { JSONPath } from 'jsonpath-plus';
const titles = JSONPath({ path: '$..title', json: data });

JSONPath 的实际应用场景

API 测试:在 Postman、Newman 等工具中,使用 JSONPath 表达式从响应中提取特定值进行断言,如验证 $.data.user.id 是否等于预期值。

Kuberneteskubectl 命令支持 JSONPath 输出格式,如 kubectl get pods -o jsonpath='{.items[*].metadata.name}' 提取所有 Pod 名称。

数据提取和转换:在 ETL(Extract-Transform-Load)流程中,使用 JSONPath 从复杂嵌套 JSON 中提取所需字段,生成结构化数据。

日志分析:结构化日志通常以 JSON 格式记录,JSONPath 查询可以快速从大量日志中提取特定字段进行分析。

立即免费使用相关工具

免费使用 →