написание более сложных JSON-схем, которые зависят от других ключей - PullRequest
6 голосов
/ 18 февраля 2011

Я писал простые схемы JSON, но столкнулся с вызовом ввода API, который немного сложнее. У меня есть один конечный маршрут restful, который может принимать 3 разных типа JSON:

локальный / Foo

можно взять:

{"type": "ice_cream", "cone": "waffle" ...}

или

{"type": "hot_dog", "bun": "wheat" ...}

Если ключ "type" содержит "ice_cream", я хочу видеть только ключ "cone", а не ключ "bun". Аналогично, если «type» содержит «hot_dog», я хочу видеть только «bun», а не «cone». Я знаю, что могу сопоставить с шаблоном, чтобы убедиться, что когда-либо вижу только «ice_cream» или «hot_dog», но я не знаю, как принудительно установить требование некоторых других полей, если для этого ключа установлено это значение. Я вижу, что есть поле схемы json, называемое "зависимость", но я не нашел хороших примеров того, как его использовать.

Кстати, я не уверен, что этот входной JSON является хорошей формой (эффективно перегружает тип структуры JSON, который он принимает), но у меня нет возможности изменить API.

1 Ответ

3 голосов
/ 25 февраля 2011

Я наконец получил некоторую информацию об этом - оказывается, вы можете сделать объединение нескольких различных объектов, которые действительны, например:

{
    "description" : "Food",
    "type" : [
        {
            "type" : "object",
            "additionalProperties" : false,
            "properties" : {
                "type" : {
                    "type" : "string",
                    "required" : true,
                    "enum": [
                        "hot_dog"
                    ]
                },
                "bun" : {
                    "type" : "string",
                    "required" : true 
                },
                "ketchup" : {
                    "type" : "string",
                    "required" : true 
                } 
            } 
        },
        {
            "type" : "object",
            "additionalProperties" : false,
            "properties" : {
                "type" : {
                    "type" : "string",
                    "required" : true,
                    "enum": [
                        "ice_cream"
                    ]
                },
                "cone" : {
                    "type" : "string",
                    "required" : true 
                },
                "chocolate_sauce" : {
                    "type" : "string",
                    "required" : true 
                } 
            } 
        }
    ]
}

Я все еще не уверен, является ли это действительным JSON, так как мой Schemavalidator умирает на каком-то недопустимом вводе, но он принимает допустимый ввод, как и ожидалось.

...