如何在JSON Schema中引用其他属性值及校验最值双向约束
关于JSON Schema中属性值引用与数值约束的解答
问题1:如何在JSON Schema中引用其他属性的值?
首先得澄清一个常见误区:$ref关键字是用来引用JSON Schema的片段(比如另一个属性的schema定义、外部schema文件等),而不是直接引用当前JSON实例中的属性值。如果要引用实例里其他属性的实际值,你需要用到$data关键字——这个特性是从JSON Schema Draft 07开始引入的。
使用$data时,你可以用JSON Pointer语法指向实例中的某个属性,比如"$data": "/minimumTolerance"就表示引用当前对象下的minimumTolerance属性的值。
问题2:能否实现minimumTolerance与maximumTolerance的大小约束?
当然可以!不过我猜你实际想表达的是maximumTolerance ≥ minimumTolerance(毕竟“不小于且反之亦然”等同于要求两值完全相等,这应该不是常见需求),下面就基于“最大值≥最小值”的合理需求给出实现方案。
首先,你的示例里用了Draft 06的schema,但Draft 06并不支持$data特性,所以得升级到Draft 07及以上版本。下面是正确的schema示例:
{ "$schema": "http://json-schema.org/draft-07/schema#", "title": "MinMax", "description": "Minimum & Maximum Tolerance", "type": "object", "properties": { "minimumTolerance": { "type": "number", "maximum": { "$data": "/maximumTolerance" } }, "maximumTolerance": { "type": "number", "minimum": { "$data": "/minimumTolerance" } } }, "required": ["minimumTolerance", "maximumTolerance"] }
这个schema会双向约束两个属性的数值:
- 确保
minimumTolerance的数值不超过maximumTolerance - 确保
maximumTolerance的数值不低于minimumTolerance
如果你的需求真的是要求两个值完全相等,只需要把maximum和minimum换成const关键字,并用$data引用对方即可:
"minimumTolerance": { "type": "number", "const": { "$data": "/maximumTolerance" } }
最后提醒下:不是所有JSON Schema验证工具都支持$data,使用前最好确认你的工具兼容Draft 07及以上版本的这个特性。
内容的提问来源于stack exchange,提问作者Daniel Mason
相关产品推荐
相关产品推荐

