通配符选择器
什么是通配符选择器?
通配符选择器(Wildcard Selector) 用星号 * 表示,意思是"所有"、"每一个"。
它就像你说"把所有人都叫过来"——不管叫什么名字、什么职位,全部选中。
基本语法
$[*] // 选择根节点的所有子节点
$.obj[*] // 选择对象的所有成员值
$.arr[*] // 选择数组的所有元素
$..* // 递归选择所有后代
* 选择对象的所有成员值
当 * 应用于对象时,它选择该对象的所有成员值(注意:不是键名,是值)。
示例
{
"company": "广州飞翔科技",
"website": "www.feixiang.net",
"established": 2018
}
| JSONPath | 结果 | 说明 |
|---|---|---|
$[*] | "广州飞翔科技"、"www.feixiang.net"、2018 | 根对象的所有值 |
💡
$[*]返回的是对象里所有键对应的值,不包含键名本身。
嵌套对象中的通配符
{
"techLead": {
"name": "翼王",
"position": "架构师",
"age": 35
}
}
| JSONPath | 结果 | 说明 |
|---|---|---|
$.techLead[*] | "翼王"、"架构师"、35 | techLead 对象的所有值 |
* 选择数组的所有元素
当 * 应用于数组时,它选择数组中的每一个元素。
示例
{
"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 |
一句话总结
提示
通配符 * 表示"所有"。对对象选所有值,对数组选所有元素,对原始值返回空。.* 是 [*] 的简写。双重通配符可以遍历嵌套数组!