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

JSON Schema跨键条件验证实现问题求助(基于条件关键字)

解决JSON Schema跨键条件验证问题

我来帮你搞定这个跨键条件验证的需求!先把你的需求再明确一遍,然后给出能正常生效的JSON Schema,再拆解每个部分的作用,帮你理解为什么之前的写法可能没起作用。

需求回顾

  1. 当x.value等于"myVal" 且 y.key1为"a"/"b"时,y.key2只能取"x"/"y"
  2. 当y.key1为"c"/"d"时,y.key2只能取"m"/"n"
  3. 其余场景下,y.key2可以使用全部允许的枚举值(我先假设全部枚举值为["x", "y", "m", "n", "z"],你可以根据实际情况替换)

正确的JSON Schema实现

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "x": {
      "type": "object",
      "properties": {
        "value": { "type": "string" }
      },
      "required": ["value"]
    },
    "y": {
      "type": "object",
      "properties": {
        "key1": { "type": "string", "enum": ["a", "b", "c", "d", "e"] },
        "key2": { "type": "string", "enum": ["x", "y", "m", "n", "z"] }
      },
      "required": ["key1", "key2"]
    }
  },
  "required": ["x", "y"],
  "allOf": [
    // 规则1:x.value=myVal 且 y.key1为a/b → y.key2只能是x/y
    {
      "if": {
        "allOf": [
          { "properties": { "x": { "properties": { "value": { "const": "myVal" } } } } },
          { "properties": { "y": { "properties": { "key1": { "enum": ["a", "b"] } } } }
        ]
      },
      "then": {
        "properties": {
          "y": { "properties": { "key2": { "enum": ["x", "y"] } } }
        }
      }
    },
    // 规则2:y.key1为c/d → y.key2只能是m/n
    {
      "if": {
        "properties": { "y": { "properties": { "key1": { "enum": ["c", "d"] } } } }
      },
      "then": {
        "properties": {
          "y": { "properties": { "key2": { "enum": ["m", "n"] } } }
        }
      }
    }
  ]
}

关键部分解释

  1. 基础结构定义:先在properties里明确x和y的结构,以及y.key1/y.key2的基础枚举范围,确保基础类型合法。
  2. allOf包裹条件规则:两个规则是独立生效的,所以用allOf把它们组合起来,确保只要满足对应的if条件,就会触发then的限制。
  3. 规则1的条件组合:因为需要同时满足x.value=myVal和y.key1=a/b,所以在if里用allOf把这两个子条件组合起来,只有两个都满足时,才会限制y.key2的取值。
  4. 默认场景覆盖:y.key2的基础enum已经包含了所有允许的值,所以当不满足规则1和规则2的条件时,就会自动使用这个默认范围,对应你的需求3。

测试示例

  • 符合规则1的JSON:

    {
      "x": { "value": "myVal" },
      "y": { "key1": "a", "key2": "x" }
    }
    

    验证通过;如果把y.key2改成"m",则验证失败。

  • 符合规则2的JSON:

    {
      "x": { "value": "otherVal" },
      "y": { "key1": "c", "key2": "m" }
    }
    

    验证通过;如果把y.key2改成"x",则验证失败。

  • 符合默认场景的JSON:

    {
      "x": { "value": "otherVal" },
      "y": { "key1": "e", "key2": "z" }
    }
    

    验证通过,y.key2可以用任何基础枚举值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:23:15