Проверить объекты в массиве JSON с помощью Ajv

Я пытаюсь проверить, есть ли в массиве «действия» определенные объекты. Каждый объект может иметь свои собственные свойства в зависимости от свойства типа. Массив действий может иметь несколько вхождений из этого типа объектов, а не только один.

Мой JSON:

{
    "actions": [
        {
            "type": "X",
            "a": 1,
            "b": 2,
            "c": 3
        },
        {
            "type": "Y",
            "d": 1,
            "e": 2,
            "f": 3
        }
    ]
}

В этом примере объект с type = X имеет обязательные свойства как a, b, c. Тип объекта Y в массиве имеет обязательные свойства d, e, f.

Я пытаюсь проверить это с помощью ключевого слова switch:

{
    "type": "object",
    "required": [
        "actions"
    ],
    "properties": {
        "actions": {
            "type": "array",
            "items": {
                "switch": [
                    {
                        "if": {
                            "properties": {
                                "type": {
                                    "pattern": "^X$"
                                }
                            }
                        },
                        "then": {
                            "required": [
                                "a",
                                "b",
                                "c"
                            ]
                        }
                    },
                    {
                        "if": {
                            "properties": {
                                "type": {
                                    "pattern": "^Y$"
                                }
                            }
                        },
                        "then": {
                            "required": [
                                "d",
                                "e",
                                "f"
                            ]
                        }
                    }
                ]
            }
        },
    }
}

Но все же я не мог понять, как использовать ключевое слово switch для проверки объектов массивов, где каждый тип объекта определяется свойством в объекте, поэтому тип объекта можно идентифицировать с помощью свойства.


person Zoltan Szabo    schedule 05.03.2017    source источник


Ответы (1)


Ваша схема выглядит почти нормально, вам может понадобиться последняя {then: false} подсхема внутри "switch", поскольку без нее, если свойство "type" не равно ни X, ни Y, проверка будет успешной.

Кроме того, вместо использования {pattern: '^X$'} вы можете использовать {enum: ['X']} или даже {constant: 'X'} (в draft-06 это "const"); вместо использования переключателя вы можете использовать «if / then / else» (из ajv-keywords, скорее всего, он будет включен в черновик-07) или даже «выбрать», что может быть более подходящим для такого сценария.

Может быть, вы сможете прояснить последний вопрос, я не думаю, что понимаю.

person esp    schedule 05.03.2017
comment
Я добавил эту ложную подсхему. Он по-прежнему не может проверить json, если я удалю свойство 'a'. Он говорит, что действительно. - person Zoltan Szabo; 05.03.2017
comment
хорошо, спасибо, проблема заключалась в том, что я использовал 5.0.3-beta вместо 4.x. - person Zoltan Szabo; 05.03.2017
comment
Вы можете использовать бета-версию, но тогда нужно добавить переключатель из ключевых слов ajv. См. Руководство по миграции: github.com/epoberezkin/ajv/releases/ tag / 5.0.1-beta.0 - person esp; 06.03.2017