Json.NET Schema未按Schema规则正确校验JSON数据问题排查
Json.NET Schema 校验全过问题排查与修复
核心问题原因
- Schema版本与使用的关键字不兼容
你两份Schema都声明使用draft-04规范,但用到了高版本才支持的关键字:const是JSON Schema draft-06才新增的关键字if/then/else是JSON Schema draft-07才正式支持的关键字
按照JSON Schema规范,校验器遇到当前版本不认识的关键字会直接忽略,不执行对应校验逻辑。部分在线校验工具默认做了跨版本兼容,所以能正常出结果,但Json.NET Schema会严格按照你声明的$schema版本解析规则,未知关键字全部跳过,最终就会出现无论输入什么都判定通过的情况。
- Schema和测试JSON存在语法缺陷
你贴出来的Schema、测试JSON片段都缺少最外层的开头大括号{,如果代码中直接使用这段片段加载Schema,会出现JSON解析失败。如果你的代码没有捕获Schema加载阶段的异常,后续校验逻辑会直接跳过,默认返回通过结果。 - if/then/else逻辑编写错误
你写的条件规则里加了"else": false,这个配置的含义是:只要不满足if的匹配条件,就直接判定校验失败。比如当输入type为text时,匹配不到radio/dropdown的if分支,就会触发else规则直接报错,完全不符合你按type校验必填字段的预期,这也是你第二份Schema在在线工具里校验异常的原因之一。
修复步骤
- 调整Schema版本声明:如果要使用
const、if/then/else关键字,把$schema字段修改为draft-07及以上版本,即替换为"$schema": "http://json-schema.org/draft-07/schema#"。 - 修正条件校验逻辑:删除所有
else: false配置,if/then规则只需要声明「当if条件匹配时,必须满足then里的要求」即可,不匹配的分支不需要额外配置,不会触发错误。 - 补全Schema和测试JSON的语法:确保所有JSON结构完整,外层大括号、括号配对正确,加载Schema时增加异常捕获,确认Schema成功解析后再执行校验。
- 检查.NET侧校验代码:确认调用校验方法后正确读取了校验结果和错误集合,不要出现调用了校验方法但未判断返回值、默认走通过分支的低级错误。
- 如果必须兼容draft-04版本,把所有
const替换为单值的enum(比如"const": "file"改为"enum": ["file"]),同时完全移除if/then/else写法,仅使用oneOf、allOf这类draft-04原生支持的组合关键字实现条件必填规则。
内容的提问来源于stack exchange,提问作者Emanuel Ioan Radu
相关产品推荐
相关产品推荐

