求助:在Helm中使用JSON Schema 2020-12实现可选枚举
Helm中JSON Schema 2020-12枚举属性非必填校验问题
问题场景
我在Helm中使用JSON Schema draft 2020-12版本,想要实现一个非必填的枚举属性:未指定该属性时直接忽略,指定时则校验值是否在枚举范围内。但当前配置无法实现需求,配置代码如下:
"myobj": { "type": "object", "additionalProperties": false, "properties": { "optionalEnum": { "type": "string", "default": "aaa", "enum": [ "aaa", "bbb", "ccc" ] } // 其他属性... } }
当不指定optionalEnum时,会收到错误提示:optionalEnum must be one of the following: "aaa", "bbb", "ccc"。我不想将null加入枚举值(禁止用户设置为null),请问如何实现仅在属性被设置时应用枚举校验?另外,JSON Schema是否区分“未设置”和“空/Null”属性?
解决方案
你的核心问题大概率是该属性被误加入了required数组——JSON Schema默认所有properties下的属性都是非必填的,只有被列入required数组的属性才会强制要求存在。
要实现需求,只需确保optionalEnum不在myobj的required列表中。修正后的schema示例:
"myobj": { "type": "object", "additionalProperties": false, "required": [ // 仅保留必须存在的属性,不要包含optionalEnum ], "properties": { "optionalEnum": { "type": "string", "default": "aaa", "enum": [ "aaa", "bbb", "ccc" ] } // 其他属性... } }
调整后会达到以下效果:
- 未指定
optionalEnum时,不会触发该属性的校验逻辑,Helm会自动使用默认值aaa - 指定
optionalEnum时,会严格校验值是否在枚举范围内 - 如果用户设置
optionalEnum: null,会因type: string的规则直接校验失败,符合你禁止设置null的需求
关于“未设置”与“Null”的区分
JSON Schema完全区分这两种情况:
- 未设置属性:对象中不存在对应的键,此时不会触发该属性的任何校验规则
- 设置为Null:对象中存在该键且值为
null,此时会按照该属性的schema规则校验(比如你的type: string会直接拒绝null值)
内容的提问来源于stack exchange,提问作者red888
相关产品推荐
相关产品推荐

