如何在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
相关产品推荐
相关产品推荐

