2015-04-23 2 views
0

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

ТИА

ответ

0

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

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

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

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

Смежные вопросы