JSON Schema是否支持校验字符串值匹配独立对象的属性名列表
JSON Schema跨节点属性名校验实现说明
- 你当前使用的 Draft-07 版本JSON Schema原生不支持这类动态跨节点校验:标准Draft-07没有提供读取实例其他节点内容作为校验规则的能力,你目前写的固定正则
^Site[d]$存在两个问题:- 正则写法错误:
[d]仅匹配字符d,要匹配数字需要写成\d即^Site\d$ - 只能校验值的格式符合
Site+数字的规则,无法保证值一定真实存在于conectionStrings对象的属性名列表中,比如值为Site9时正则可以通过,但如果conectionStrings下没有Site9属性,校验不会报错
- 正则写法错误:
- 要实现你要的动态关联约束,有两种可行路径:
- 使用带
$data扩展的校验库(兼容Draft-07)
主流校验器比如Ajv支持广泛使用的$data非标准扩展,可以通过JSON Pointer直接引用实例内其他节点的内容作为校验参数,只需要修改connectionString和defaultSite字段的校验规则即可:
其中"connectionString": { "title": "Connection String", "type": "string", "enum": { "$data": "/conectionStrings#/propertyNames" } }, "defaultSite": { "title": "Default Site", "type": "string", "enum": { "$data": "/conectionStrings#/propertyNames" } }/conectionStrings#/propertyNames是指向根节点下conectionStrings对象所有属性名的JSON Pointer,直接作为枚举值集合,就可以强制要求字段值必须是已存在的连接字符串键名。 - 预生成静态枚举(无依赖兼容所有Schema版本)
如果不能使用扩展校验能力,只能在生成JSON Schema时,提前把conectionStrings下的所有属性名提取出来,硬编码写到enum规则里,缺点是每次conectionStrings的键名变动都需要同步更新Schema,无法做到动态关联。
- 使用带
- 补充说明:截止2020-12版本的官方JSON Schema标准,仍未内置跨实例节点引用数据作为校验规则的原生能力,这类动态值校验目前都依赖校验器扩展或者预生成规则实现。
- 额外提示:
- 你给出的示例JSON里
defaultSite值为GENBuild,按照你要的约束规则属于非法值,因为conectionStrings下不存在这个键名 - 你当前用的键名
conectionStrings存在拼写错误,标准拼写为connectionStrings,如果不需要兼容现有业务逻辑建议修正,避免后续维护混淆。
- 你给出的示例JSON里
内容的提问来源于stack exchange,提问作者Colin
相关产品推荐
相关产品推荐

