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

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

过滤器选择器(下)

逻辑运算符

过滤器支持三种逻辑运算符,用来组合多个条件:

运算符含义示例
&&逻辑 AND(并且)@.age > 25 && @.department == '技术部'
`\\`逻辑 OR(或者)`@.age < 25 \\@.age > 35`
!逻辑 NOT(非)!@.isActive

优先级

逻辑运算符有优先级(从高到低):

  1. !(NOT)最优先
  2. 比较运算符(==、> 等)
  3. &&(AND)
  4. \|\|(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 == '产品部'`

一句话总结

提示

&& 是"并且",都要满足;|| 是"或者",满足一个;! 是"非",取反。用 () 改变优先级。组合条件可以写出非常精确的筛选规则!

上一页
过滤器选择器(上)
下一页
后代段