过滤器选择器(下)
逻辑运算符
过滤器支持三种逻辑运算符,用来组合多个条件:
| 运算符 | 含义 | 示例 | ||||
|---|---|---|---|---|---|---|
&& | 逻辑 AND(并且) | @.age > 25 && @.department == '技术部' | ||||
| `\ | \ | ` | 逻辑 OR(或者) | `@.age < 25 \ | \ | @.age > 35` |
! | 逻辑 NOT(非) | !@.isActive |
优先级
逻辑运算符有优先级(从高到低):
!(NOT)最优先- 比较运算符(
==、>等) &&(AND)\|\|(OR)最宽松
💡 可以用括号
()改变优先级,就像数学运算一样。
逻辑 AND:&&
&& 表示"并且"——两个条件同时满足才选中。
示例
{
"employees": [
{"name": "航仔", "age": 28, "department": "技术部", "isActive": true},
{"name": "翼王", "age": 35, "department": "技术部", "isActive": true},
{"name": "图妹", "age": 30, "department": "产品部", "isActive": true},
{"name": "风速", "age": 29, "department": "技术部", "isActive": false}
]
}
AND 查询
| 查询目标 | JSONPath | 结果 | 说明 |
|---|---|---|---|
| 技术部且年龄>30 | $.employees[?@.department == '技术部' && @.age > 30] | 翼王 | 两个条件都满足 |
| 技术部且在职 | $.employees[?@.department == '技术部' && @.isActive] | 航仔、翼王 | 部门是技术部,且 isActive 存在(为 true) |
| 年龄>25且年龄<30 | $.employees[?@.age > 25 && @.age < 30] | 航仔、风速 | 25 < 年龄 < 30 |
💡
&&是"并且",缺一不可。就像招聘要求"本科并且有 3 年经验",两个都要满足。
逻辑 OR:||
|| 表示"或者"——两个条件满足一个就选中。
OR 查询
| 查询目标 | JSONPath | 结果 | 说明 | ||
|---|---|---|---|---|---|
| 技术部或产品部 | `$.employees[?@.department == '技术部' \ | \ | @.department == '产品部']` | 航仔、翼王、风速、图妹 | 满足任一条件 |
| 年龄<25或年龄>35 | `$.employees[?@.age < 25 \ | \ | @.age > 35]` | 翼王 | 只有翼王>35 |
| 是航仔或是翼王 | `$.employees[?@.name == '航仔' \ | \ | @.name == '翼王']` | 航仔、翼王 | 指定两个人 |
💡
||是"或者",满足一个就行。就像"会 Java 或者 Python 都可以投简历"。
逻辑 NOT:!
! 表示"非"、"不是"、"否定"。
NOT 查询
| 查询目标 | JSONPath | 结果 | 说明 |
|---|---|---|---|
| 不是技术部的 | $.employees[?@.department != '技术部'] | 图妹 | 用 != |
| 不在职的 | $.employees[?!@.isActive] | 风速 | ! 否定存在性 |
| 年龄不大于 30 | $.employees[?!(@.age > 30)] | 航仔、图妹、风速 | 否定整个条件 |
💡
!@.isActive和@.isActive == false不同:
!@.isActive:检查字段是否存在,不存在或值为 false 都满足@.isActive == false:字段必须存在,且值等于 false
括号分组:改变优先级
用 () 可以改变运算顺序:
{
"employees": [
{"name": "航仔", "age": 28, "department": "技术部"},
{"name": "翼王", "age": 35, "department": "技术部"},
{"name": "图妹", "age": 30, "department": "产品部"},
{"name": "鸣哥", "age": 31, "department": "运营部"}
]
}
分组查询
| 查询目标 | JSONPath | 结果 | 说明 | ||
|---|---|---|---|---|---|
| 技术部且年龄>30,或产品部 | `$.employees[?(@.department == '技术部' && @.age > 30) \ | \ | @.department == '产品部']` | 翼王、图妹 | 先算括号里的 |
| 不加括号 | `$.employees[?@.department == '技术部' && @.age > 30 \ | \ | @.department == '产品部']` | 翼王、图妹 | && 优先级高,结果相同 |
| 技术部,或年龄>30且产品部 | `$.employees[?@.department == '技术部' \ | \ | (@.age > 30 && @.department == '产品部')]` | 航仔、翼王、图妹 | 括号改变结果 |
💡 括号就像数学里的优先级:先算括号里的,再算外面的。
实战:飞翔科技复杂筛选
示例 JSON
{
"employees": [
{"name": "航仔", "age": 28, "department": "技术部", "isActive": true, "salary": 8888},
{"name": "翼王", "age": 35, "department": "技术部", "isActive": true, "salary": 232000},
{"name": "凌叔", "age": 32, "department": "技术部", "isActive": true, "salary": 12000},
{"name": "空少", "age": 26, "department": "技术部", "isActive": true, "salary": 15000},
{"name": "风速", "age": 29, "department": "技术部", "isActive": false, "salary": 18000},
{"name": "图妹", "age": 30, "department": "产品部", "isActive": true, "salary": 20000},
{"name": "星宇", "age": 24, "department": "产品部", "isActive": true, "salary": 8000},
{"name": "靓晴", "age": 27, "department": "产品部", "isActive": true, "salary": 16000},
{"name": "鸣哥", "age": 31, "department": "运营部", "isActive": true, "salary": 14000},
{"name": "雁姐", "age": 33, "department": "运营部", "isActive": true, "salary": 17000},
{"name": "波比", "age": 25, "department": "运营部", "isActive": true, "salary": 10000},
{"name": "云吞", "age": 24, "department": "运营部", "isActive": true, "salary": 9000}
]
}
复杂查询
| 查询目标 | JSONPath | 结果 | ||
|---|---|---|---|---|
| 技术部且在职且年龄>30 | $.employees[?@.department == '技术部' && @.isActive && @.age > 30] | 翼王、凌叔 | ||
| 工资>15000且年龄<30 | $.employees[?@.salary > 15000 && @.age < 30] | 靓晴 | ||
| 技术部或产品部且在职 | `$.employees[?(@.department == '技术部' \ | \ | @.department == '产品部') && @.isActive]` | 航仔、翼王、凌叔、空少、图妹、星宇、靓晴 |
| 不在技术部且年龄>=30 | $.employees[?@.department != '技术部' && @.age >= 30] | 图妹、鸣哥、雁姐 | ||
| 已离职或工资<10000 | `$.employees[?!@.isActive \ | \ | @.salary < 10000]` | 风速、星宇、云吞 |
| 年龄 25~30(含) | $.employees[?@.age >= 25 && @.age <= 30] | 航仔、空少、风速、图妹、靓晴、波比 |
常见错误
| 错误写法 | 问题 | 正确写法 | ||||
|---|---|---|---|---|---|---|
?@.age > 25 && < 30 | 第二个条件缺少 @.age | ?@.age > 25 && @.age < 30 | ||||
?@.age > 25 and @.age < 30 | 用了 and | ?@.age > 25 && @.age < 30 | ||||
| `?@.age > 25 \ | \ | < 30` | 第二个条件缺少 @.age | `?@.age > 25 \ | \ | @.age < 30` |
?@.department == '技术部' && '产品部' | 右侧不是完整条件 | `?@.department == '技术部' \ | \ | @.department == '产品部'` |
一句话总结
提示
&& 是"并且",都要满足;|| 是"或者",满足一个;! 是"非",取反。用 () 改变优先级。组合条件可以写出非常精确的筛选规则!