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

    • 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 综合实战

实战数据

以下 JSON 将作为所有查询的查询参数:

{
  "company": "广州飞翔科技",
  "englishName": "FEIXIANG",
  "website": "www.feixiang.net",
  "established": 2018,
  "isActive": true,
  "slogan": "愿你朝华相顾,愿你前程似锦。",
  "departments": [
    {
      "name": "技术部",
      "headcount": 5,
      "members": [
        {"name": "航仔", "position": "后端开发", "age": 28, "isActive": true, "salary": 8888.00, "hobbies": ["钓鱼", "看科幻小说", "深夜撸串"]},
        {"name": "翼王", "position": "架构师", "age": 35, "isActive": true, "salary": 232000.00, "hobbies": ["健身", "改装车", "收藏机械键盘"]},
        {"name": "凌叔", "position": "运维工程师", "age": 32, "isActive": true, "salary": 12000.00, "hobbies": ["泡茶", "养鹦鹉", "逛花鸟市场"]},
        {"name": "空少", "position": "前端开发", "age": 26, "isActive": true, "salary": 15000.00, "hobbies": ["穿搭", "探店", "拍vlog"]},
        {"name": "风速", "position": "算法工程师", "age": 29, "isActive": false, "salary": 18000.00, "hobbies": ["竞速游戏", "魔方", "收集跑鞋"]}
      ]
    },
    {
      "name": "产品部",
      "headcount": 3,
      "members": [
        {"name": "图妹", "position": "产品经理", "age": 30, "isActive": true, "salary": 20000.00, "hobbies": ["手账", "盲盒", "奶茶测评"]},
        {"name": "星宇", "position": "产品助理", "age": 24, "isActive": true, "salary": 8000.00, "hobbies": ["天文", "indie游戏", "写科幻短篇"]},
        {"name": "靓晴", "position": "UI设计师", "age": 27, "isActive": true, "salary": 16000.00, "hobbies": ["插画", "烘焙", "逛展"]}
      ]
    },
    {
      "name": "运营部",
      "headcount": 4,
      "members": [
        {"name": "鸣哥", "position": "内容运营", "age": 31, "isActive": true, "salary": 14000.00, "hobbies": ["脱口秀", "剧本杀", "组织饭局"]},
        {"name": "雁姐", "position": "用户运营", "age": 33, "isActive": true, "salary": 17000.00, "hobbies": ["炒股", "煲汤", "家长里短情报站"]},
        {"name": "波比", "position": "活动运营", "age": 25, "isActive": true, "salary": 10000.00, "hobbies": ["街舞", "极限运动", "薅羊毛"]},
        {"name": "云吞", "position": "社群运营", "age": 24, "isActive": true, "salary": 9000.00, "hobbies": ["探店", "做甜品", "追港剧"]}
      ]
    }
  ]
}

基础查询

2.1 公司基本信息

查询目标JSONPath结果
公司全称$.company"广州飞翔科技"
英文名称$.englishName"FEIXIANG"
官网$.website"www.feixiang.net"
成立年份$.established2018
是否活跃$.isActivetrue
标语$.slogan"愿你朝华相顾,愿你前程似锦。"

2.2 部门信息

查询目标JSONPath结果
所有部门$.departments3 个部门对象
部门数量$.departments[*]3 个部门对象
第一个部门$.departments[0]技术部对象
最后一个部门$.departments[-1]运营部对象
所有部门名称$.departments[*].name技术部、产品部、运营部
所有部门人数$.departments[*].headcount5、3、4

员工信息查询

3.1 按部门查员工

查询目标JSONPath结果
技术部所有员工$.departments[0].members[*]5 个员工对象
技术部所有员工姓名$.departments[0].members[*].name航仔、翼王、凌叔、空少、风速
产品部所有员工职位$.departments[1].members[*].position产品经理、产品助理、UI设计师
运营部第 1 人$.departments[2].members[0]鸣哥对象
运营部最后 1 人$.departments[2].members[-1]云吞对象

3.2 跨部门查询(用通配符)

查询目标JSONPath结果
全公司所有员工$.departments[*].members[*]12 个员工对象
全公司所有员工姓名$.departments[*].members[*].name12 个姓名
全公司所有员工职位$.departments[*].members[*].position12 个职位
全公司所有员工年龄$.departments[*].members[*].age12 个年龄

3.3 递归查询(用后代段)

查询目标JSONPath结果
递归找所有 name$..name技术部、产品部、运营部、航仔、翼王...(共 15 个)
递归找所有 position$..position12 个职位
递归找所有 age$..age12 个年龄
递归找所有 hobbies 数组$..hobbies12 个爱好数组
递归找所有爱好$..hobbies[*]所有爱好字符串

条件筛选查询

4.1 按年龄筛选

查询目标JSONPath结果
年龄大于 30$.departments[*].members[?@.age > 30]翼王、凌叔、鸣哥、雁姐
年龄小于 25$.departments[*].members[?@.age < 25]星宇、云吞
年龄在 25~30 之间$.departments[*].members[?@.age >= 25 && @.age <= 30]航仔、空少、风速、图妹、靓晴、波比

4.2 按部门+条件筛选

查询目标JSONPath结果
技术部年龄>30$.departments[0].members[?@.age > 30]翼王、凌叔
产品部年龄<30$.departments[1].members[?@.age < 30]星宇、靓晴
运营部年龄>30$.departments[2].members[?@.age > 30]鸣哥、雁姐

4.3 按工资筛选

查询目标JSONPath结果
工资大于 15000$.departments[*].members[?@.salary > 15000]翼王、图妹、靓晴、雁姐
工资小于 10000$.departments[*].members[?@.salary < 10000]航仔、星宇、云吞
工资在 10000~20000 之间$.departments[*].members[?@.salary >= 10000 && @.salary <= 20000]凌叔、空少、风速、图妹、靓晴、鸣哥、波比、雁姐

4.4 按在职状态筛选

查询目标JSONPath结果
已离职员工$.departments[*].members[?@.isActive == false]风速
在职员工$.departments[*].members[?@.isActive]其余 11 人

复杂组合查询

5.1 多条件组合

查询目标JSONPath结果
技术部且在职且年龄>30$.departments[0].members[?@.isActive && @.age > 30]翼王、凌叔
工资>15000且年龄<30$.departments[*].members[?@.salary > 15000 && @.age < 30]靓晴
技术部或产品部且工资>15000`$.departments[*].members[?(@.position == '架构师' \\@.position == '产品经理') && @.salary > 15000]`翼王、图妹

5.2 函数查询

查询目标JSONPath结果
爱好>=3个的员工$.departments[*].members[?length(@.hobbies) >= 3]全部 12 人(每人都有 3 个爱好)
成员>=4人的部门$.departments[?count(@.members) >= 4]技术部、运营部
成员=3人的部门$.departments[?count(@.members) == 3]产品部

切片查询

查询目标JSONPath结果
前 2 个部门$.departments[:2]技术部、产品部
除第 1 个部门外的员工$.departments[1:].members[*].name图妹、星宇、靓晴、鸣哥、雁姐、波比、云吞
技术部前 3 人$.departments[0].members[:3]航仔、翼王、凌叔
技术部后 2 人$.departments[0].members[-2:]空少、风速
技术部倒序$.departments[0].members[::-1]风速、空少、凌叔、翼王、航仔

JSONPath 语法速查表

语法含义示例
$根节点$
@当前节点(过滤器内)?@.age > 30
.name子段(点表示法)$.company
['name']子段(括号表示法)$['company']
[*]通配符$.members[*]
.*通配符简写$.obj.*
[0]索引$.members[0]
[-1]负数索引$.members[-1]
[1:3]切片$.members[1:3]
[::-1]反向切片$.members[::-1]
..name后代段$..name
..*所有后代$..*
[?expr]过滤器$.members[?@.age > 30]
&&逻辑 AND?@.age > 25 && @.age < 30
`\\`逻辑 OR`?@.dept == '技术部' \\@.dept == '产品部'`
!逻辑 NOT?!@.isActive
==等于?@.age == 28
!=不等于?@.dept != '技术部'
> < >= <=比较?@.salary > 10000
length()长度函数?length(@.hobbies) >= 3
count()计数函数?count(@.members) >= 4
match()正则匹配?match(@.phone, '138.*')
search()正则搜索?search(@.hobbies, '游戏')

学习路线回顾

恭喜你读完了全部 21 篇 JSON + JSONPath 学习指南!

JSON 基础(10 篇):

  1. JSON 是什么
  2. 六种数据类型
  3. 对象 Object
  4. 数组 Array
  5. 字符串 String
  6. 数字 Number
  7. 布尔值和 Null
  8. 字符编码与转义
  9. JSON 语法规则
  10. 综合应用示例

JSONPath 查询(11 篇): 11. JSONPath 是什么 12. 根标识符和基本路径 13. 名称选择器 14. 索引选择器 15. 通配符选择器 16. 数组切片选择器 17. 过滤器选择器(上) 18. 过滤器选择器(下) 19. 后代段 20. 函数扩展 21. 综合实战


提示

📌 JSONPath 核心口诀:

$ 开头找根,@ 当前元素; . 深入一层,.. 递归全找; [] 选索引,[*] 全都要; [?] 加条件,&& || ! 组合妙; length count match search 函数来帮忙。

上一页
函数扩展