You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现仅当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 00:21:26