oneOf属性验证失败:如何修正JSON实例符合Schema规则?
问题根源
你遇到的错误是因为提交的JSON实例同时符合oneOf里的两个子Schema。说白了,就是你定义的两个子Schema没做互斥限制——第一个只说了C是布尔类型,但没要求必须有C,也没说不能有D;第二个只说了D是能被3整除的整数,同样没要求必须有D或者不能有C。所以当你提交只有D:9的实例时,它既不违反第一个Schema的规则,又符合第二个,自然就触发了oneOf“只能匹配其中一个”的验证失败。
修正JSON实例的方法
要让实例通过验证,得确保它只符合其中一个子Schema,同时明确不符合另一个:
要是想匹配带C的子Schema
- 在
B对象里加个布尔类型的C(比如true或者false),然后把D删掉。 - 示例:
这样实例只会匹配第一个子Schema,因为第二个Schema要求的{ "B": { "C": false } }D不存在,自然就不匹配了。
要是想匹配带D的子Schema
- 最简单的办法是确保
B里只有D:9,同时修改你的Schema(这才是根治问题的办法)——给两个子Schema分别加上required和additionalProperties: false。比如:
改完Schema后,只带"oneOf": [ { "type": "object", "properties": { "C": { "type": "boolean" } }, "required": ["C"], "additionalProperties": false }, { "type": "object", "properties": { "D": { "type": "integer", "multipleOf": 3 } }, "required": ["D"], "additionalProperties": false } ]D:9的实例就只会匹配第二个子Schema,不会触发错误。如果暂时不能改Schema,那只能给实例加个违反第一个Schema的属性(比如"C": "abc"),但这不符合“只能有C或D其中一个”的需求,所以更推荐改Schema。
内容的提问来源于stack exchange,提问作者Ravi Konaraddi
相关产品推荐
相关产品推荐

