0

我正在为收据创建一个模式,并希望为核心概念提供一个主模式,其中包含用于专业收据类型的各种不同的详细对象(例如,逐项列出的酒店收据等)。我当前的实现是利用oneOfJSON 模式中的机制

{
    "$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

4

2 回答 2

1
  1. 使用anyOf 通常会更好——很少需要oneOf。后者将始终验证所有模式,前者很可能在第一个通过时退出。

  2. 您可以查看其他一些验证器。tv4 与标准有很多偏差,而且速度也很慢。https://github.com/ebdrup/json-schema-benchmark

于 2015-06-21T00:04:04.593 回答
0

oneOf需要验证所有模式,以便验证器确保只有一个模式通过。如果没有通过或多次通过,验证器需要告诉您每个模式的验证结果,以便您确定如何修复错误。

因此,仅仅因为验证器告诉您为什么每个模式都失败并不意味着它希望所有这些模式都通过。

于 2015-04-23T06:20:14.207 回答