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

如何用JSON Schema验证YAML中引用值是否属于预定义键集合?

可以实现,具体方案如下

这个需求完全可以通过JSON Schema实现,核心是利用动态引用文档内字段的能力(仅支持Draft 2020-12及以上版本),或者在低版本中手动枚举合法值。

示例目标YAML

先明确我们要验证的YAML结构(符合你描述的格式):

myDef:
  foo: "任意字符串值"
  baz: "任意字符串值"
someProperty:
  referencedValue: "foo" # 仅允许填foo或baz

Draft 2020-12 版本的动态约束Schema

这个版本支持$data关键字,可以动态读取myDef的键名作为referencedValue的合法取值,无需手动维护枚举列表:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "myDef": {
      "type": "object",
      "properties": {
        "foo": { "type": "string" },
        "baz": { "type": "string" }
      },
      "required": ["foo", "baz"],
      "additionalProperties": false # 禁止给myDef添加未预定义的键
    },
    "someProperty": {
      "type": "object",
      "properties": {
        "referencedValue": {
          "type": "string",
          "enum": { "$data": "/myDef/properties" }
          # 动态引用myDef的所有属性名,作为referencedValue的合法选项
        }
      },
      "required": ["referencedValue"]
    }
  },
  "required": ["myDef", "someProperty"]
}

低版本(如Draft 7)的静态约束Schema

如果你的验证工具不支持Draft 2020-12,只能手动枚举合法值,缺点是后续myDef的键变更时需要同步修改枚举列表:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "myDef": {
      "type": "object",
      "properties": {
        "foo": { "type": "string" },
        "baz": { "type": "string" }
      },
      "required": ["foo", "baz"],
      "additionalProperties": false
    },
    "someProperty": {
      "type": "object",
      "properties": {
        "referencedValue": {
          "type": "string",
          "enum": ["foo", "baz"]
        }
      },
      "required": ["referencedValue"]
    }
  },
  "required": ["myDef", "someProperty"]
}

关键说明

  • additionalProperties: false的作用是限制myDef只能包含你预定义的foo和baz,避免出现未被允许的键,确保referencedValue的合法取值范围严格可控。
  • 动态方案需要使用支持Draft 2020-12的验证工具(比如Ajv v8及以上版本),如果工具版本较低,只能采用静态枚举的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:42:08