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

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

通配符选择器

什么是通配符选择器?

通配符选择器(Wildcard Selector) 用星号 * 表示,意思是"所有"、"每一个"。

它就像你说"把所有人都叫过来"——不管叫什么名字、什么职位,全部选中。

基本语法

$[*]        // 选择根节点的所有子节点
$.obj[*]    // 选择对象的所有成员值
$.arr[*]    // 选择数组的所有元素
$..*        // 递归选择所有后代

* 选择对象的所有成员值

当 * 应用于对象时,它选择该对象的所有成员值(注意:不是键名,是值)。

示例

{
  "company": "广州飞翔科技",
  "website": "www.feixiang.net",
  "established": 2018
}
JSONPath结果说明
$[*]"广州飞翔科技"、"www.feixiang.net"、2018根对象的所有值

💡 $[*] 返回的是对象里所有键对应的值,不包含键名本身。

嵌套对象中的通配符

{
  "techLead": {
    "name": "翼王",
    "position": "架构师",
    "age": 35
  }
}
JSONPath结果说明
$.techLead[*]"翼王"、"架构师"、35techLead 对象的所有值

* 选择数组的所有元素

当 * 应用于数组时,它选择数组中的每一个元素。

示例

{
  "departments": ["技术部", "产品部", "运营部"]
}
JSONPath结果说明
$.departments[*]"技术部"、"产品部"、"运营部"数组的每个元素

对象数组中的通配符

{
  "members": [
    {"name": "航仔", "position": "后端开发"},
    {"name": "翼王", "position": "架构师"},
    {"name": "图妹", "position": "产品经理"}
  ]
}
JSONPath结果说明
$.members[*]3 个对象每个员工对象
$.members[*].name"航仔"、"翼王"、"图妹"每个员工的姓名
$.members[*].position"后端开发"、"架构师"、"产品经理"每个员工的职位

💡 $.members[*].name 是实际开发中最常用的模式之一:"拿到数组里每个对象的某个字段"。


点表示法简写:.*

.* 是 [*] 的简写,功能完全相同:

完整写法简写说明
$[*]$. * ❌根节点不能用 .*
$.obj[*]$.obj.*✅ 对象子段可用
$.arr[*]$.arr.* ❌数组建议用 [*]
{
  "techLead": {"name": "翼王", "position": "架构师"}
}
$.techLead.*     → "翼王"、"架构师"(等同于 $.techLead[*])

* 不选择原始值

如果节点本身是原始值(字符串、数字、布尔值、null),* 不会选择任何内容:

{
  "company": "广州飞翔科技",
  "count": 12
}
JSONPath结果说明
$.company[*](空)company 是字符串,没有子节点
$.count[*](空)count 是数字,没有子节点

实战:飞翔科技全员信息提取

示例 JSON

{
  "company": "广州飞翔科技",
  "departments": [
    {
      "name": "技术部",
      "members": [
        {"name": "航仔", "age": 28},
        {"name": "翼王", "age": 35},
        {"name": "凌叔", "age": 32}
      ]
    },
    {
      "name": "产品部",
      "members": [
        {"name": "图妹", "age": 30},
        {"name": "星宇", "age": 24}
      ]
    }
  ]
}

查询练习

查询目标JSONPath结果
所有部门对象$.departments[*]技术部对象、产品部对象
所有部门名称$.departments[*].name"技术部"、"产品部"
技术部所有员工$.departments[0].members[*]航仔对象、翼王对象、凌叔对象
技术部所有员工姓名$.departments[0].members[*].name"航仔"、"翼王"、"凌叔"
所有部门所有员工姓名$.departments[*].members[*].name"航仔"、"翼王"、"凌叔"、"图妹"、"星宇"
根对象所有值$[*]"广州飞翔科技"、部门数组

💡 $.departments[*].members[*].name 是双重通配符,先遍历所有部门,再遍历每个部门的所有员工,最后取姓名。这是处理嵌套数组的常用技巧!


常见错误

错误写法问题正确写法
$. *根节点不能用 .*$[*]
$.company.*对原始值用通配符$.company
$.members*.name* 必须在括号内$.members[*].name

一句话总结

提示

通配符 * 表示"所有"。对对象选所有值,对数组选所有元素,对原始值返回空。.* 是 [*] 的简写。双重通配符可以遍历嵌套数组!

上一页
索引选择器
下一页
数组切片选择器