JSON Schema跨键条件验证实现问题求助(基于条件关键字)
解决JSON Schema跨键条件验证问题
我来帮你搞定这个跨键条件验证的需求!先把你的需求再明确一遍,然后给出能正常生效的JSON Schema,再拆解每个部分的作用,帮你理解为什么之前的写法可能没起作用。
需求回顾
- 当
x.value等于"myVal"且y.key1为"a"/"b"时,y.key2只能取"x"/"y" - 当
y.key1为"c"/"d"时,y.key2只能取"m"/"n" - 其余场景下,
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"] } } } } } } ] }
关键部分解释
- 基础结构定义:先在
properties里明确x和y的结构,以及y.key1/y.key2的基础枚举范围,确保基础类型合法。 allOf包裹条件规则:两个规则是独立生效的,所以用allOf把它们组合起来,确保只要满足对应的if条件,就会触发then的限制。- 规则1的条件组合:因为需要同时满足
x.value=myVal和y.key1=a/b,所以在if里用allOf把这两个子条件组合起来,只有两个都满足时,才会限制y.key2的取值。 - 默认场景覆盖:
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
相关产品推荐
相关产品推荐

