
本文旨在解决在使用 JSON Schema 的 oneOf 关键字进行校验时,可能出现的“Value is not defined in enum”的误报问题。通过分析问题原因和提供解决方案,帮助开发者更准确地理解和使用 oneOf 校验规则,从而避免不必要的错误提示。
在使用 JSON Schema 验证 JSON 数据时,oneOf 关键字用于指定数据必须符合多个子 Schema 中的一个。然而,在某些情况下,即使数据符合其中一个子 Schema,验证器仍然可能报告其他子 Schema 中的枚举错误,导致误报。
问题分析
出现这种误报的原因在于,JSON Schema 验证器会尝试验证数据是否符合 oneOf 中 所有 的子 Schema。当数据不符合某个子 Schema 的枚举约束时,验证器就会报告相应的错误。即使数据已经成功通过了另一个子 Schema 的验证,这个错误仍然会被显示出来。
示例代码
以下是一个示例 JSON Schema,用于验证包含 eventName 和 eventPayload 属性的 JSON 对象:
{ "$schema": "https://json-schema.org/draft/2019-09/schema", "type": "object", "properties": { "eventName": { "type": "string", "enum": ["Test10", "Test12", "Test1", "Test2", "Test3"] }, "eventPayload": { "type": "object", "properties": { "totalAmount": { "type": "number" } } } }, "oneOf": [ { "properties": { "eventName": { "enum": ["Test10", "Test12"] }, "eventPayload": { "properties": { "totalAmount": { "exclusiveMinimum": 0 } } } } }, { "properties": { "eventName": { "enum": ["Test1", "Test2", "Test3"] }, "eventPayload": { "properties": { "totalAmount": { "exclusiveMaximum": 0 } } } } } ]}
以下是一个示例 JSON 数据:
{ "eventName": "Test12", "eventPayload": { "totalAmount": -5 }}
使用上述 JSON Schema 验证该 JSON 数据时,会产生以下错误:
Message: Value "Test12" is not defined in enum.Schema path: #/oneOf/1/properties/eventName/enumMessage: Integer -5 is less than minimum value of 0.Schema path: #/oneOf/0/properties/eventPayload/properties/totalAmount/minimum
可以看到,即使 eventName 的值为 “Test12” 符合第一个子 Schema 的枚举约束,验证器仍然报告了第二个子 Schema 中的枚举错误。
解决方案
AVCLabs
AI移除视频背景,100%自动和免费
268 查看详情
虽然无法完全避免验证器报告所有子 Schema 的错误,但可以采取一些策略来减少误报的影响:
仔细设计 Schema 结构: 确保 oneOf 中的子 Schema 尽可能地互斥。如果子 Schema 之间存在重叠的枚举值,可能会增加误报的概率。
忽略无关的错误信息: 在处理验证结果时,可以根据实际情况忽略那些与成功匹配的子 Schema 不相关的错误信息。例如,如果数据成功通过了第一个子 Schema 的验证,则可以忽略第二个子 Schema 的枚举错误。
使用自定义验证逻辑: 如果需要更精确的控制,可以考虑使用自定义验证逻辑来替代 oneOf 关键字。例如,可以使用编程语言编写代码来检查数据是否符合特定的条件。
总结
oneOf 关键字是 JSON Schema 中一个强大的工具,可以用于指定数据必须符合多个子 Schema 中的一个。但是,在使用 oneOf 时,需要注意可能出现的枚举误报问题。通过仔细设计 Schema 结构、忽略无关的错误信息或使用自定义验证逻辑,可以有效地减少误报的影响,从而更准确地验证 JSON 数据。
注意事项
不同的 JSON Schema 验证器可能对 oneOf 的实现方式略有不同。因此,在使用 oneOf 时,建议仔细阅读所使用的验证器的文档,了解其具体的行为和限制。
以上就是使用 JSON Schema 的 oneOf 校验时避免误报枚举错误的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/746131.html
微信扫一扫
支付宝扫一扫