выбор между разными объектами в JSON-схеме

Я создаю схему для квитанций и хочу иметь основную схему для основных концепций с множеством различных объектов подробностей для специализированных типов квитанций (например, детализированных квитанций отеля и т. д.). Моя текущая реализация использует механизм 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» и т. д.), но есть ли способ указать, что они являются группой и что только один из них должен существовать в проверяемом документе?

ТИА


person Howard Dierking    schedule 23.04.2015    source источник


Ответы (2)


  1. Обычно лучше использовать anyOf — очень редко когда вам нужен oneOf. Последний всегда будет проверять все схемы, первый, скорее всего, завершит работу при первом прохождении.

  2. Вы можете посмотреть на некоторые другие валидаторы. tv4 имеет много отклонений от стандарта, а также очень медленный. https://github.com/ebdrup/json-schema-benchmark

person esp    schedule 21.06.2015

Все схемы в oneOf должны быть проверены, чтобы валидатор мог гарантировать, что пройдет только одна из схем. Если ни один не прошел или прошел более одного раза, валидатор должен сообщить вам результаты проверки каждой схемы, чтобы вы могли определить, как исправить ошибку.

Итак, только потому, что валидатор сообщает вам, почему каждая из схем дает сбой, не означает, что он ожидает, что все эти схемы пройдут.

person Jason Desrosiers    schedule 23.04.2015