2015-10-06 3 views
3

У меня есть эта схема. Он проверяет комментарии и отлично работает на данный момент.JSON Schema - несколько типов

var schema = { 
    id: '', 
    type: 'object', 
    additionalProperties: false, 
    properties: { 
    text: { 
     type: 'string', 
     minLength: 1, 
     required: true 
    }, 
    author: { 
     type: 'number', 
     required: true 
    } 
    } 
}; 

Мой комментарий структура:

{ 
    text: "Hello world!", 
    author: 1 
} 

Но теперь, мне нужно проверить массив объектов, как это. Так что я могу получить что-то вроде:

[ 
    { 
     text: "Hello world! Im comment #1", 
     author: 1 
    }, 
    { 
     text: "Super awesome comment #2!", 
     author: 0 
    } 
    ] 

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

Я слышал о схеме json anyOf, но я не знаю, как это сделать.

джазе:

anyOf 
    schema-1 (object) 
    schema-2 (array with objects) 

Любая помощь?

Спасибо.

ответ

3

Решения иметь общее определение в одном месте, а затем ссылаться, что общее определение из двух различных вариантов внутри oneOf:

Здесь мы помещаем простое определение объекта внутри definitions:

{ 
    "definitions": { 
     "singleObject": { 
      ... same definition as in your question ... 
     } 
    } 
} 

затем мы ссылаемся на эту схему, внутри oneOf:

{ 
    "oneOf": [ 
     {"$ref": "#/definitions/singleObject"}, // plain object 
     { 
      "type": "array", // array of plain objects 
      "items": {"$ref": "#/definitions/singleObject"} 
     } 
    ], 
    "definitions": { 
     "singleObject": {...} 
    } 
} 

Вы ч n организуйте это несколькими разными способами - я лично часто заканчиваю определение простого объекта как корневой схемы и имею переключатель single/array в definitions, поэтому схема для моих документов на самом деле - http://example.com/schema#/definitions/arrayOrSingle.

+0

Спасибо, это работает. почему бы не '' 'anyOf''' вместо' '' oneOf'''? – jBaumann

+1

В этом случае они были бы похожи друг на друга, потому что это не может быть как объект, так и массив. Однако, в общем случае, если вы явно не хотите, чтобы это было возможно, использование 'oneOf' одинаково легко читается и более явственно относится к ожидаемому поведению. – cloudfeet

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