лучший способ сделать условные массивы в json схеме с приличными сообщениями об ошибках - PullRequest
0 голосов
/ 30 января 2020

Я хотел бы ограничить (кортеж) массив в JSON -схеме и получить достойные сообщения об ошибках, но пока мне это не удалось.

Массив состоит из 2 элементов, первым является строка , а второй объект. Свойства, которые разрешены / обязательны для объекта, зависят от строки. 2 допустимых примера:

{
    "color": [ "white", { "a white property": 42 }]
}

и

{
    "color": [ "black", { "this is a black property": "tAttUQoLtUaE" }]
}

для справки, тип в машинописи будет определен как:

type MyObject = {
    color:
    | ["white", {
        "a white property": number
    }]
    | ["black", {
        "this is a black property": string
    }]
}

Я пытался ' oneOf '(см. ниже), и это работает, но если файл недействителен, сообщение об ошибке непонятно. Вы можете попробовать этот экземпляр на jsonschemavalidator.org:

{
  "color": [ "black", {
      "XXX": "foo"
  }]
}

Моя попытка:

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "http://example.com/root.json",
    "type": "object",
    "required": [
        "color"
    ],
    "properties": {
        "color": {
            "oneOf": [
                {
                    "type": "array",
                    "items": [
                        {
                            "enum": [ "white"]
                        },
                        {
                            "type": "object",
                            "required": [ "a white property" ],
                            "additionalProperties": false,
                            "properties": {
                                "a white property": {
                                    "type": "number"
                                }
                            }
                        }
                    ]
                },
                {
                    "type": "array",
                    "items": [
                        {
                            "enum": ["black"]
                        },
                        {
                            "type": "object",
                            "required": [ "this is a black property" ],
                            "additionalProperties": false,
                            "properties": {
                                "this is a black property": {
                                    "type": "string"
                                }
                            }
                        }
                    ]
                }
            ]
        }
    },
    "additionalProperties": false
}

Есть ли лучший способ express это правило?

1 Ответ

1 голос
/ 30 января 2020

См. атрибут jsonSchema, условно обязательный , для описания четырех стратегий условных ограничений. Здесь они располагаются в том порядке, в котором стратегия выдает лучшие сообщения об ошибках.

  1. dependencies: это очень конкретное ограничение c, поэтому оно имеет тенденцию к есть отличные сообщения об ошибках. К сожалению, это не сработает в вашей ситуации.

  2. if / then: это даст лучшие сообщения в вашем случае.

  3. Вывод : выдает довольно хорошие сообщения об ошибках, но не так хорошо, как if / then. if / then добавлено в черновик-07. Если вы не можете использовать черновик-07 или выше, это ваша лучшая ставка.

  4. Enum : это тот, который вы используете, и он вызывает ужасные ошибки как вы видели. Это худший вариант для сообщений об ошибках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...