json проверяет все элементы массива по той или иной схеме

Учитывая следующую схему:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "definitions": {
        "worktype": {
            "blue": {
                "enum": [1, 2, 3]
            },
            "red": {
                "enum": [4, 5, 6]
            }
        }
    }
}

Я могу проверить, что массив состоит либо из всех «синих» элементов, либо из «красных» элементов следующим образом:

{
                "type": "array",
                "items": {
                    "$ref": "#/definitions/worktype/red"    // or worktype/blue
                }
}

Но как я могу проверить массив на наличие только «синих» или «красных» рабочих типов, но не смешанных?

Например:

[1, 2]: Valid (only blue)
[5]: Valid (only red)
[1, 6]: Invalid (mixed blue and red)

Моей первой идеей было использование oneOf:

{
                "type": "array",
                "items": {
                    "oneOf": [
                        {"$ref": "#/definitions/worktype/red"},
                        {"$ref": "#/definitions/worktype/blue"},
                    ]
                }
}

Но это проверяет каждую запись для себя по схемам, поэтому, например, [1, 6] тоже действительна. (На самом деле, в этом случае oneOf не означает, что "все элементы должны быть действительными против одного из вместе", но "каждый элемент должен быть действительным против одного из для себя").

Как я могу написать схему для массива, который имеет только «синий» или «красный» рабочие типы, но не оба? Это возможно?


person Markus    schedule 03.08.2014    source источник


Ответы (1)


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

{
                "type": "array",
                "oneOf": [
                    {
                        "items": {
                            "$ref": "#/definitions/worktype/red"
                        }   
                    },  
                    {
                        "items": {
                            "$ref": "#/definitions/worktype/blue"
                        }   
                    }   
                ]
}
person Markus    schedule 06.08.2014