飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • JSON

    • JSON 是什么
    • JSON 的六种数据类型
    • 对象(Object)
    • 数组(Array)
    • 字符串(String)
    • 数字(Number)
    • 布尔值和 Null
    • 字符编码与转义
    • JSON 语法规则
    • 综合应用示例
  • JSONPath

    • JSONPath 是什么
    • 根标识符和基本路径
    • 名称选择器
    • 索引选择器
    • 通配符选择器
    • 数组切片选择器
    • 过滤器选择器(上)
    • 过滤器选择器(下)
    • 后代段
    • 函数扩展
    • JSONPath 综合实战

JSONPath 是什么

本系列基于 RFC 9535 官方规范编写,面向零基础新手。 从本篇开始,进入 JSONPath 查询表达式的学习。


JSONPath 是什么?

JSONPath 是一种查询语言,用来从 JSON 数据中查找和提取你需要的内容。

生活类比

想象你有一份飞翔科技的员工档案(JSON 数据):

  • 你想知道所有员工的姓名 → JSONPath 可以帮你找出来
  • 你想知道技术部有哪些人 → JSONPath 可以筛选出来
  • 你想知道年龄大于 30 岁的员工 → JSONPath 可以过滤出来

JSONPath 就像数据库的 SQL 查询语句,只不过它是专门用来查询 JSON 数据的。


JSONPath 与 JSON Pointer 的区别

RFC 9535 明确说明:JSONPath 不是 JSON Pointer 的替代品,而是更强大的伴侣。

特性JSON PointerJSONPath
用途定位单个已知路径的值搜索和提取多个值
能力只能按固定路径找支持通配符、过滤、切片
类比像直接按门牌号找人像按条件搜索找人

示例对比

给定 JSON:

{
  "company": "广州飞翔科技",
  "departments": [
    {"name": "技术部", "members": [{"name": "航仔"}, {"name": "翼王"}]},
    {"name": "产品部", "members": [{"name": "图妹"}]}
  ]
}
工具表达式结果
JSON Pointer/departments/0/members/0/name"航仔"(只能找一个)
JSONPath$.departments[*].members[*].name航仔、翼王、图妹(找出一批)

JSONPath 的设计灵感

JSONPath 的设计受到了 XPath(XML 的查询语言)的启发:

XPathJSONPath含义
/$根节点
.@当前节点
//..后代(递归查找)
**通配符
[][]下标/过滤

💡 如果你学过 XPath,JSONPath 会很容易上手。如果没学过,也完全没关系!


JSONPath 的基本结构

一个 JSONPath 表达式由以下部分组成:

$  +  段1  +  段2  +  段3  +  ...
部分说明示例
$根标识符,表示"从根开始"$
.name子段(点表示法),选择对象的子节点$.company
['name']子段(括号表示法),功能同上$['company']
[0]索引选择器,选择数组元素$.departments[0]
[*]通配符选择器,选择所有子节点$.departments[*]
..name后代段,递归查找所有后代$..name
[?expr]过滤器选择器,按条件筛选$.members[?@.age>30]

第一个 JSONPath 例子

以下面的 JSON 为查询参数:

{
  "company": "广州飞翔科技",
  "website": "www.feixiang.net",
  "established": 2018,
  "departments": [
    {"name": "技术部", "headcount": 5},
    {"name": "产品部", "headcount": 3},
    {"name": "运营部", "headcount": 4}
  ],
  "slogan": "愿你朝华相顾,愿你前程似锦。"
}

查询示例

JSONPath 表达式结果说明
$整个 JSON根节点
$.company"广州飞翔科技"查询公司名称
$.established2018查询成立年份
$.departments[0]{"name":"技术部","headcount":5}第一个部门
$.departments[0].name"技术部"第一个部门的名称
$.departments[*].name"技术部"、"产品部"、"运营部"所有部门名称
$..name"技术部"、"产品部"、"运营部"递归找所有 name
$.slogan"愿你朝华相顾,愿你前程似锦。"公司标语

两种表示法:点表示法 vs 括号表示法

JSONPath 支持两种写法,功能完全相同:

点表示法(简写,更简洁)

$.company
$.departments[0].name

括号表示法(更通用,支持特殊字符)

$['company']
$['departments'][0]['name']

什么时候必须用括号表示法?

场景点表示法括号表示法
普通名称✅ $.name✅ $['name']
名称含空格❌ 不支持✅ $['member name']
名称含特殊字符❌ 不支持✅ $['name@2024']
名称是数字❌ 不支持✅ $['123']
名称含中文✅ $.名称✅ $['名称']

💡 建议:平时用点表示法更简洁,遇到特殊名称时用括号表示法。


JSONPath 学习路线

接下来的文档,我们将逐个学习 JSONPath 的核心功能:

  1. ✅ JSONPath 是什么(本文)
  2. 根标识符和基本路径
  3. 名称选择器 —— 按键名找对象值
  4. 索引选择器 —— 按位置找数组元素
  5. 通配符选择器 —— * 匹配所有
  6. 数组切片选择器 —— start:end:step
  7. 过滤器选择器(上)—— 存在性测试与比较
  8. 过滤器选择器(下)—— 逻辑运算符
  9. 后代段 —— .. 递归查找
  10. 函数扩展 —— length()、count() 等
  11. JSONPath 综合实战 —— 飞翔科技数据查询大全

提示

📌 记住一句话:JSONPath 就是 JSON 的"搜索语言",用 $ 开头,像导航一样一层层找到你想要的数据。

下一页
根标识符和基本路径