我正在为收据创建一个模式,并希望为核心概念提供一个主模式,其中包含用于专业收据类型的各种不同的详细对象(例如,逐项列出的酒店收据等)。我当前的实现是利用oneOf
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
错误)? - 如果不可能,我只需拥有一组“类型化”详细信息属性(如“generalDetail”、“hotelDetail”等)就可以了——但有没有办法指定它们是一个组并且只有其中一个应该存在于正在验证的文档中?
TIA