JSON Schema搭配if/then/else使用allOf/anyOf/oneOf校验异常原因求解
问题原因解析
首先明确JSON Schema中if/then结构的基础校验逻辑:
当数据满足
if字段定义的schema规则时,必须同时满足then字段定义的schema规则,整个if/then块才算校验通过;如果数据不满足if规则,整个if/then块会直接判定为校验通过,和then的规则无关。
1. 改为anyOf后非法数据校验通过的原因
anyOf关键字的校验规则是:只要任意一个子schema校验通过,整体就判定为通过。
你传入{ country: "Canada", postal_code: "some invalid code" }时,三个if/then子块的校验结果如下:
- 第一个子块
if规则要求country为美国,你的数据不满足该条件,所以第一个子块直接判定为通过。
此时anyOf已经找到符合要求的子schema,直接终止后续校验返回整体通过,完全不会校验加拿大对应的邮编规则,因此非法数据也能通过。
当你仅保留加拿大对应的if/then语句时,没有其他自动通过的子块,if规则匹配后会走then的邮编校验,非法邮编自然会触发校验失败。
2. 改为oneOf后提示多个schema匹配的原因
oneOf关键字的校验规则是:必须恰好有一个子schema校验通过,整体才判定为通过,多于或少于一个都判定为失败。
当你传入任意合法国家的有效数据时,三个if/then子块的校验结果如下(以加拿大合法数据为例):
- 美国对应的子块:
if规则不匹配,直接通过 - 加拿大对应的子块:
if规则匹配,邮编也合法,子块通过 - 荷兰对应的子块:
if规则不匹配,直接通过
此时有3个子schema同时通过,完全不符合oneOf的要求,因此直接报错提示多个匹配。
原方案使用allOf的合理性
allOf要求所有子schema都必须通过:不匹配if规则的子块自动通过,匹配if规则的子块必须通过对应then的邮编校验,刚好实现了「不同国家对应不同邮编规则」的需求。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

