У меня есть набор данных, который выглядит так:
{
type: "step",
label: "Step 1",
fields: [
// An optional field
{
type: "email",
label: "Your Email"
},
// A field that is required and can be either amount|preset
{
type: "amount",
label: "Amount"
},
// A field that is required and can be either credit_card|ach
{
type: "credit_card",
label: "Credit Card"
}
]
}
Массив fields
может содержать множество объектов различных типов. Вышеприведенный пример будет действительным.
{
type: "step",
label: "Step 1",
fields: [
{
type: "email",
label: "Your Email"
},
{
type: "credit_card",
label: "Credit Card"
}
]
}
Это должно ошибка, поскольку не включает в себя объект типа amount
или presets
Чтобы быть действительными, fields
должны содержать 2 объекта.
1 из них должен быть либо { type: "amount" }
либо { type: "presets" }
1 из них должен быть либо { type: "credit_card" }
либо { type: "ach" }
Любая комбинация из 2 сделает fields
действительными.
Вот моя (неудачная) схема JSON:
{
"title": "step",
"type": "object",
"properties": {
"type": {
"title": "type",
"type": "string"
},
"label": {
"title": "label",
"type": "string"
},
"fields": {
"title": "fields",
"description": "Array of fields",
"type": "array",
"additionalItems": true,
"minItems": 1,
"items": {
"type": "object",
"anyOf": [
{ "properties": { "type": { "enum": ["amount", "preset"] } } },
{ "properties": { "type": { "enum": ["credit_card", "ach"] } } }
],
"properties": {
"type": {
"type": "string",
}
}
},
}
},
"required": ["type", "label", "fields"]
}
Вот ссылка на JSON Schema Validation Reference
Я думаю, что между contains
, anyOf
, allOf
, oneOf
и enum
я должен быть в состоянии сделать это?
Поместите в схему /properties/fields
. Это выражает те ограничения, которые вам нужны. Удалить /properties/fields/items/anyOf
(это неправильно) и /properties/fields/additionalItems
/properties/fields/items/anyOf
(он ничего не делает).
"allOf": [
{
"contains": {
"properties": { "type": { "enum": ["amount", "presets"] } }
}
},
{
"contains": {
"properties": { "type": { "enum": ["credit_card", "ach"] } }
}
}
]
contains
было реализовано только в версии 6, и некоторые библиотеки валидаторов могут не поддерживать его. В этом случае потребовался переход отjsonschema
кajv
npm libs.contains
ограничение без проекта-06, но это другой вопрос :-)