UI传入空/Null值时,JSON Schema枚举类型默认值不生效问题咨询
解决JSON Schema枚举类型在传入空/Null时默认值不生效的问题
问题根源
JSON Schema的default关键字仅在属性完全缺失时生效,当UI显式传入null或空字符串""时,不属于属性缺失场景,因此默认值不会触发。另外你当前的Schema存在语法错误:default = "N"应该改为"default": "N"(JSON语法要求键值对用冒号分隔)。
可行解决方案
方案1:使用JSON Schema条件校验+默认值(需支持Draft 7+的校验器,如Ajv)
通过if-then-else规则,针对传入null或空字符串的场景,强制应用默认值。示例Schema如下:
{ "BankAccount": { "type": ["string", "null"], "oneOf": [ { "enum": ["Y", "N"] }, { "const": "" }, { "const": null } ], "default": "N", "if": { "anyOf": [ { "const": "" }, { "const": null } ] }, "then": { "default": "N" } } }
注意:部分JSON Schema校验器需要开启默认值填充配置(比如Ajv需设置useDefaults: true),才能让条件默认值生效。
方案2:数据预处理拦截(通用方案,不受校验器限制)
在将UI传入的数据提交给JSON Schema校验前,手动遍历数据,把值为null或空字符串的BankAccount字段替换为默认值"N"。以JavaScript为例:
// 假设uiData是UI传入的原始数据 const uiData = { BankAccount: "" }; // 或null // 预处理逻辑 if (uiData.BankAccount === null || uiData.BankAccount === "") { uiData.BankAccount = "N"; } // 再进行JSON Schema校验 const validate = ajv.compile(schema); const valid = validate(uiData);
方案3:调整Schema的类型与枚举范围(简化版)
如果允许把空字符串和null视为等效于默认值"N",可以直接将它们加入枚举,同时保留默认值:
{ "BankAccount": { "type": ["string", "null"], "enum": ["Y", "N", "", null], "default": "N" } }
之后在业务逻辑中,将""或null统一转换为"N"即可。
内容的提问来源于stack exchange,提问作者Kiran Babu
相关产品推荐
相关产品推荐

