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

JSON Schema是否支持校验字符串值匹配独立对象的属性名列表

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

内容的提问来源于stack exchange,提问作者Colin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:45:41