JSON Schema - требуется все свойства

Поле required в схеме JSON

JSON Schema имеет поля properties, required и additionalProperties. Например,

{
    "type": "object",
    "properties": {
        "elephant": {"type": "string"},
        "giraffe": {"type": "string"},
        "polarBear": {"type": "string"}
    },
    "required": [
        "elephant",
        "giraffe",
        "polarBear"
    ],
    "additionalProperties": false
}

Будет проверять объекты JSON, например:

{
    "elephant": "Johnny",
    "giraffe": "Jimmy",
    "polarBear": "George"
}

Но не удастся, если список свойств не является точно elephant, giraffe, polarBear.

Проблема

Я часто копирую-вставляю список properties в список required и подвергаюсь раздражающим ошибкам, когда списки не совпадают из-за опечаток и других глупых ошибок.

Есть ли более короткий способ обозначить, что все свойства необходимы, без явного их названия?

Ответы

Ответ 1

Вы можете просто использовать свойство "minProperties", а не explicity, называя все поля.

{
    "type": "object",
    "properties": {
        "elephant": {"type": "string"},
        "giraffe": {"type": "string"},
        "polarBear": {"type": "string"}
    },
    "additionalProperties": false,
    "minProperties": 3
}

Ответ 2

Я сомневаюсь, что существует способ указать требуемые свойства, кроме явно указывать их в требуемом массиве.

Но если вы столкнулись с этой проблемой очень часто, я предлагаю вам написать небольшой script, который будет обрабатывать вашу json-схему и автоматически добавить необходимый массив для всех определенных объектов.

script нужно просто пересечь дерево json-schema, и на каждом уровне, если найдено ключевое слово "properties", добавьте ключевое слово "required" со всеми определенными ключами, содержащимися в свойствах на том же уровне.

Пусть машины делают материал для бурения.

Ответ 3

Я делаю это в коде с одним слоем, например, если я хочу использовать required для insert в БД, но хочу только проверять схему при выполнении update.

prepareSchema(action) {
    const actionSchema = R.clone(schema)
    switch (action) {
        case 'insert':
            actionSchema.$id = `/${schema.$id}-Insert`
            actionSchema.required = Object.keys(schema.properties)
            return actionSchema
        default:
            return schema
    }
}