【问题标题】:choosing between different objects in JSON-schema在 JSON 模式中的不同对象之间进行选择
【发布时间】:2015-06-21 08:04:04
【问题描述】:

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

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

【问题讨论】:

    标签: jsonschema json-schema-validator


    【解决方案1】:
    1. 通常使用 anyOf 会更好 - 当您需要 oneOf 时很少使用。后者将始终验证所有模式,前者很可能在第一个通过时退出。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-25
        • 2019-06-17
        • 2014-11-07
        • 1970-01-01
        • 1970-01-01
        • 2010-10-09
        • 1970-01-01
        • 1970-01-01
        • 2012-02-15
        相关资源
        最近更新 更多