我正在为收据创建架构,并希望拥有核心概念的主架构,其中包含各种不同的详细对象,用于专门的收据类型(例如逐项的酒店收据等)。我当前的实施是利用{{ JSON-schema中的机制
oneOf
这种方法的问题在于,当我验证(使用tv4)时,似乎正在检查{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Receipt",
"type": "object",
"properties": {
...
"amount": { "type": "number" },
"detail": {
"type": "object",
"oneOf": [
{ "$ref": "general-detail.schema.json" },
{ "$ref": "hotel-detail.schema.json" },
...
]
}
}
}
中指定的所有模式,并且实际上是返回错误。我可以通过删除oneOf
属性,将detail
移动到模式级别(例如oneOf
之外)然后在每个子属性中创建根属性名称来最小化此效果模式。但是,即使在这种情况下,如果我在验证酒店收据类型时出现错误,我会收到“缺少必需的财产:generalDetail”。
所以有2个问题:
properties
属性,而不是验证器完全验证detail
结构中的每个子模式(例如我使用{{1错误的)?TIA
答案 0 :(得分:1)
通常使用anyOf更好 - 当你需要oneOf时很少。后者将总是验证所有模式,前者最有可能在第一次传递时退出。
您可以查看其他一些验证器。 tv4与标准有许多偏差,也很慢。 https://github.com/ebdrup/json-schema-benchmark
答案 1 :(得分:0)
需要验证oneOf
中的所有模式,以便验证程序确保只有一个模式通过。如果没有通过或多次传递,验证器需要告诉您每个模式的验证结果,以便您确定如何修复错误。
因此,仅仅因为验证器告诉您为什么每个模式都失败并不意味着它期望所有这些模式都通过。