如何在JSON Schema中基于其他属性值验证属性值?
动态验证JSON属性值唯一性方案
针对你需要验证对象中所有属性值唯一(允许任意输入值)的需求,可以使用JSON Schema Draft 7及以上版本支持的$data关键字来实现动态值引用,无需预先指定固定值。
完整验证Schema示例
{ "type": "object", "properties": { "A": { "type": "string", "not": { "anyOf": [ {"const": {"$data": "1/B"}}, {"const": {"$data": "1/C"}} ] } }, "B": { "type": "string", "not": { "anyOf": [ {"const": {"$data": "1/A"}}, {"const": {"$data": "1/C"}} ] } }, "C": { "type": "string", "not": { "anyOf": [ {"const": {"$data": "1/A"}}, {"const": {"$data": "1/B"}} ] } } } }
规则说明
$data关键字用于动态引用当前对象内的其他属性值,路径1/A表示当前层级(对象层级)下的A属性值。- 每个属性通过
not.anyOf规则,确保自身值不等于另外两个属性的任意一个值。 - 无论用户输入什么字符串,只要三个属性中出现重复值,就会触发验证失败。
可选属性适配(若属性非必填)
如果部分属性是可选的,仅当属性存在时才验证值唯一性,可以调整为if/then组合规则:
{ "type": "object", "properties": { "A": { "type": "string", "allOf": [ { "if": {"required": ["B"]}, "then": {"not": {"const": {"$data": "1/B"}}} }, { "if": {"required": ["C"]}, "then": {"not": {"const": {"$data": "1/C"}}} } ] }, "B": { "type": "string", "allOf": [ { "if": {"required": ["A"]}, "then": {"not": {"const": {"$data": "1/A"}}} }, { "if": {"required": ["C"]}, "then": {"not": {"const": {"$data": "1/C"}}} } ] }, "C": { "type": "string", "allOf": [ { "if": {"required": ["A"]}, "then": {"not": {"const": {"$data": "1/A"}}} }, { "if": {"required": ["B"]}, "then": {"not": {"const": {"$data": "1/B"}}} } ] } } }
这种写法下,只有当对应属性存在时,才会检查值是否重复,避免因属性缺失导致的不必要验证失败。
内容的提问来源于stack exchange,提问作者melvin
相关产品推荐
相关产品推荐

