Эффективно проверить вложенную JSON схему / конфигурацию на внешнем интерфейсе - PullRequest
2 голосов
/ 14 марта 2020

У меня есть следующая конфигурация JSON в проекте typescript. Я хотел бы проверить это на внешнем интерфейсе во время выполнения. Я ищу решение, подобное node-convict.

Мне нужно проверить

  1. уникальный id / Нет дублирующегося идентификатора.
  2. уникальное имя.
  3. обязательное свойство не пусто type
  4. Условно несколько дочерних типов, например, если type === folder, они должны иметь children prop. это может быть пустой массив.
  5. Вложенные объекты на нескольких уровнях.

Я нашел AJV. Документы AJV относятся только к целому объекту, который является уникальным, а не задает c свойств. Я мог бы придумать свой собственный и сделать некоторую рекурсивную проверку. Однако я ищу наиболее эффективное решение, будь то использование ajv, другой библиотеки или эффективной структуры данных, которую я мог бы использовать для проверки этого.

Если вы используете внешнюю библиотеку, она должна быть совместима с машинописью. Я НЕ ищу валидацию во время компиляции машинописи.

[{
    "type": "folder",
    "name": "",
    "id": 1, // UUID
    "chldren": [{
            "id": 11, // UUID
            "type": "table", // TABLE TYPE
            "name": "Some Table 1",
            "meta": {},
            "dataSource": "..........."
        },
        {
            "type": "folder", // FOLDER TYPE
            "name": "",
            "id": 111, // UUID
            "chldren": [{
                "type": "folder",
                "name": "",
                "id": 1111, // UUID
                "chldren": [{
                    "id": 11111, // UUID
                    "type": "table",
                    "name": "Some Another Table",
                    "meta": {},
                    "dataSource": "..........."
                }]
            }]
        }
    ]
}]

1 Ответ

1 голос
/ 14 марта 2020

Я бы порекомендовал использовать библиотеку для проверки данных Joi . Начиная с версии 16. браузер поддерживает .

Например, например:

import Joi from '@hapi/joi';

const schema = Joi.object({
    type: Joi.string()
        .alphanum()
        .required(),

    id: Joi.number()
        .integer()

    // I've not defined the whole schema for your object...
})     

Затем вы можете проверить свой объект, используя:

schema.validate({ type: 'folder', id: 1 });
// -> { error: null, value: { type: 'folder', id: 1 }}

Или:

try {
    const value = await schema.validateAsync({ type: 'folder', id: 1 });
}
catch (err) { }

Вы можете получить набор текста для Джои из здесь .

Пример этой работы можно найти здесь .

...