我正在为收据创建模式,并希望为核心概念提供一个主模式,并为专门的收据类型提供各种不同的明细对象(例如,分项酒店收据等)我当前实现借力oneOf
机制,JSON-模式在JSON模式中的不同对象之间进行选择
{
"$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" },
...
]
}
}
}
这种方法的问题是,当我验证(使用TV4),似乎都在oneOf
指定的模式都被检查,并实际上,返回错误。通过删除detail
属性,将oneOf
移动到架构级别(例如properties
之外),然后在每个子架构中创建根属性名称,我可以最大限度地减少这种影响。但是,即使在这种情况下,如果我验证酒店收据类型时发生错误,我会收到“丢失所需属性:generalDetail”。
所以2个问题:
- 是它甚至有可能用一个通用的
detail
财产像我目前做的,而不是有验证完全验证的oneOf
结构中的每个子模式(例如,我使用的oneOf
错误)? - 如果这是不可能的,我会比单纯有一组'typed'细节属性(如'generalDetail','hotelDetail'等)更好 - 但是有没有办法指定它们是并且只有其中一个应该存在于正在验证的文档中?
TIA