Я хочу иметь разные проверки для одного и того же свойства при определенных условиях.Как мне использовать if-then
для достижения этой цели?
Я пытался сделать oneOf
, а затем другие if-then
в зависимости от типа operator
, который у меня есть.Поэтому, если у меня есть между , я хочу, чтобы value
было что-то вроде [[1,2],[4,5]]
, но если у меня в , я хочу, чтобы value
было [1,2,3]
или ["a","b","c"]
Моя схема выглядит следующим образом:
%{
definitions: %{
rule: %{
type: "object",
required: ["attribute", "operator", "value"],
properties: %{
attribute: %{
enum: ["show_shop", "shop_item"]
},
operator: %{
enum: ["in", "between"]
},
},
oneOf: [
%{
if: %{definitions: %{rule: %{properties: %{operator: %{const: "between"}}}}},
then: %{
properties: %{
value: %{
type: "array",
minItems: 1,
items: %{
oneOf: [
%{
type: "array",
items: [%{type: "number"}, %{type: "number"}],
additionalItems: false,
minItems: 2,
maxItems: 2
},
%{
type: "array",
items: [%{type: "null"}, %{type: "number"}],
additionalItems: false,
minItems: 2,
maxItems: 2
},
%{
type: "array",
items: [%{type: "number"}, %{type: "null"}],
additionalItems: false,
minItems: 2,
maxItems: 2
}
]
}
},
additionalProperties: false
}
}
},
%{
if: %{definitions: %{rule: %{properties: %{operator: %{const: "in"}}}}},
then: %{
properties: %{
value: %{
type: "array",
items: %{type: "number"},
minItems: 1,
},
additionalProperties: false
}
}
},
%{
if: %{definitions: %{rule: %{properties: %{operator: %{const: "in"}}}}},
then: %{
properties: %{
value: %{
type: "array",
items: %{type: "string"},
minItems: 1,
},
additionalProperties: false
}
}
}
]
}
},
type: "array",
items: %{"$ref": "#/definitions/rule"},
minItems: 1
}
[ { "value": [1,2,3,4], "operator": "between", "attribute": "show_shop" } ]
-> должен выдавать ошибку, потому что оператор между должен принимать только массив массива
[ { "value": [ [1,3] ], "operator": "between", "attribute": "show_shop" } ]
-> должен быть в порядке
[ { "value": [ [1,3] ], "operator": "in", "attribute": "show_shop" } ]
-> должендать ошибку, потому что оператор in принимает только массив целых чисел или массив строк
[ { "value": ["a", "b"], "operator": "in", "attribute": "show_shop" } ]
-> должно быть в порядке
Независимо от оператора, если его значение составляет список списка или список чисел или список строк jsonявляется действительным.Это как if
условие вообще не оценивается.Так что из всех моих предыдущих примеров я не получаю никаких ошибок.(Также у меня нет ошибок схемы)