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

如何在JSON Schema中实现基于SchemaVer的版本条件字段校验?

问题解答

可行性结论

在JSON Schema 2019-09及后续版本中,完全可以不拆分version字段,直接通过表达式实现你的需求;如果使用更早的版本(如draft-07及以前),拆分字段会是更稳妥的方案。

不拆分字段的实现方案(JSON Schema 2019-09+)

利用$expr关键字支持的JSON逻辑表达式,直接解析version字符串的各个部分并判断条件。示例Schema如下:

{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "type": "object",
  "properties": {
    "version": {
      "type": "string",
      "pattern": "^\\d+-\\d+-\\d+$"
    },
    "new_backward_compatible_field": {
      "type": "string"
    }
  },
  "required": ["version"],
  "allOf": [
    {
      "if": {
        "$expr": {
          "and": [
            // 确保version分割后至少有3个部分,避免格式错误
            { ">=": [ { "split": [ { "var": ["version"] }, "-" ] }, 3 ] },
            // 提取Y部分(索引1)转数字,判断>=0
            { ">=": [ { "number": { "split": [ { "var": ["version"] }, "-" ], "index": 1 } }, 0 ] },
            // 提取Z部分(索引2)转数字,判断>=2
            { ">=": [ { "number": { "split": [ { "var": ["version"] }, "-" ], "index": 2 } }, 2 ] }
          ]
        }
      },
      "then": {
        // 版本符合要求时,允许新增字段存在
        "properties": {
          "new_backward_compatible_field": { "type": "string" }
        }
      },
      "else": {
        // 版本不符合要求时,禁止新增字段被必填
        "not": {
          "required": ["new_backward_compatible_field"]
        }
      }
    }
  ]
}

拆分字段的实现方案(兼容旧版JSON Schema)

如果你的环境不支持$expr,把version拆分为major、minor(对应你的Y)、patch(对应你的Z)三个独立字段,判断逻辑会更简单直接:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "version": {
      "type": "object",
      "properties": {
        "major": { "type": "integer" },
        "minor": { "type": "integer" },
        "patch": { "type": "integer" }
      },
      "required": ["major", "minor", "patch"]
    },
    "new_backward_compatible_field": { "type": "string" }
  },
  "required": ["version"],
  "allOf": [
    {
      "if": {
        "properties": {
          "version": {
            "properties": {
              "minor": { "minimum": 0 },
              "patch": { "minimum": 2 }
            },
            "required": ["minor", "patch"]
          }
        }
      },
      "then": { "properties": { "new_backward_compatible_field": { "type": "string" } } },
      "else": { "not": { "required": ["new_backward_compatible_field"] } }
    }
  ]
}

方案选择建议

  • 若使用的JSON Schema版本支持$expr,优先选择不拆分字段的方案,保持原有数据结构的一致性。
  • 若受限于旧版本环境,拆分字段的方案逻辑更清晰,也避免了字符串解析可能带来的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:11:18