Есть несколько ключевых слов, на которые вы хотите обратить внимание и, вероятно, обратитесь к спецификации для:
Во-первых, «тип» позволяет указывать несколько значений в массиве. При этом вы можете указать, например, ["string", "number"]
, что означает «строка или число». Многие ключевые слова применяются, только когда экземпляр имеет определенный тип JSON. Как правило, вы можете комбинировать схему одного «типа» и другой с другим «типом», если все остальные ключевые слова применяются только к соответствующим типам.
Так, например, вы можете иметь два схемы типа:
{
"type": "string",
"minLength": 1
}
{
"type": "number",
"minimum": 0
}
И поскольку «минимум» применяется только к числам, а «minLength» применяется только к строкам, вы можете просто объединить схемы вместе, и это будет иметь тот же эффект:
{
"type": ["string", "number"],
"minLength": 1
"minimum": 0
}
Однако, с двумя схемами одного и того же "типа", выполнение этого будет выполнять пересечение вместо объединения. Это связано с тем, что при добавлении ключевых слов в схему JSON добавляются ограничения, а при добавлении значений в список «type» удаляются ограничения (больше значений становятся действительными).
Поэтому, если вы выполняете объединение двух схем одного и того же типа или, если вы комбинируете схемы с ключевыми словами, которые проверяются для всех типов (в частности, enum или const), вам необходимо объединить их с ключевым словом anyOf, которое выполняет объединение в массиве нескольких схем. (Вы также можете рассмотреть вариант «oneOf».)
Я думаю, что у вас получится такая схема:
{
"type": "object",
"properties": {
"idle_session_timeout": {
"type": ["number","string"],
"anyOf": [ {"type":"number"}, {"const":"none"} ]
},
"item": {
"type": "object",
"required": ["kind", "name"],
"properties": {
"kind": { "type": "string" },
"name": { "type": "string" },
},
"anyOf": [
{
"properties": {
"kind": { "const": "attribute" },
}
},
{
"properties": {
"kind": { "const": "relation" },
}
},
{
"required": ["entries"],
"properties": {
"kind": { "const": "group" },
"label": { "type": "string" },
"entries": { "type":"array", "items": {"$ref":"PresentationItem"} },
}
}
]
},
"order_by": {
"type": ["string", "object"],
"required": ["attribute"],
"properties": {
"attribute": { "type": "string" },
"direction": { "enum": ["asc", "desc"] },
}
}
}
Обратите внимание на то, как я выделил общие ключевые слова из «anyOf» в максимально возможный уровень. Это стилист c выбор. Это приводит к чуть более чистым ошибкам, но может не иметь значения для вас, в зависимости от того, как вы планируете расширять схему.