Я хотел бы ограничить (кортеж) массив в 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 это правило?