如何实现仅当field1为1时允许field2为true的JSON校验规则?
实现"field1为1时才允许field2为true"的JSON校验逻辑
核心规则回顾
- 仅当
field1取值为1时,field2可以是true - 若
field1不为1,field2必须是false
原有代码问题
你之前用oneof结合excludes的逻辑完全不符合需求:{'excludes': 'field1', 'allowed': [1]}的写法是错误的,excludes用于指定字段互斥,和你需要的"条件依赖"逻辑不匹配,因此无法拦截{"field1": 2, "field2": true}这种非法情况。
正确实现方案(以Cerberus为例,适配你的代码风格)
方案1:用oneof结合条件依赖
通过拆分两种合法场景,明确约束规则:
schema = { 'field1': { 'type': 'integer', 'default': 1, }, 'field2': { 'type': 'boolean', 'default': False, 'oneof': [ # 场景1:field2为false,对field1无额外限制 {'allowed': [False]}, # 场景2:field2为true,必须满足field1等于1 { 'allowed': [True], 'dependencies': { 'field1': {'allowed': [1]} } } ] } }
这个逻辑会强制校验:要么field2是false(无论field1是什么合法整数),要么field2是true且field1必须为1,直接拦截非法组合。
方案2:自定义校验函数(更灵活)
如果需要更直观的逻辑,可以写自定义校验器直接判断条件:
def check_field2_condition(field, value, error): if value is True: if field.document.get('field1') != 1: error(field.schema, "field2只能在field1为1时设为true") schema = { 'field1': { 'type': 'integer', 'default': 1, }, 'field2': { 'type': 'boolean', 'default': False, 'check_with': check_field2_condition } }
当field2为true时,函数会检查field1的值,不满足则抛出错误,逻辑清晰易懂。
测试验证
- 允许的场景:
{"field1": 2, "field2": false}→ 校验通过{"field1": 1, "field2": true}→ 校验通过
- 禁止的场景:
{"field1": 2, "field2": true}→ 校验失败,触发错误
内容的提问来源于stack exchange,提问作者Yohann Pitrey
相关产品推荐
相关产品推荐

