У меня есть схема для проверки json.
Для определенных свойств мне нужно, чтобы они имели значения определенных типов.
- Если свойство "attr" равно "a", тогда свойство "val" должно быть "целым числом".
- Если свойство "attr" равно "x", тогда свойство "val" должно быть "логическим".
- Если свойство "attr" равно "b", то свойство "val" должно быть "строкой" в формате "ipv4".
и так далее...
Это я могу определить с помощью oneOff. Для всех других свойств "attr" мне нужно, чтобы они имели определенный формат, вроде как уловка всех, со свойством "val" быть "string".
- Если "attr" соответствует шаблону, тогда свойство "val" должно быть "string".
это можно сделать.
Это схема, которая у меня есть на данный момент.
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"name": {
"title": "name",
"type": "string"
},
"attribute": {
"title": "attributes",
"type": "object",
"$ref": "#/definitions/expr",
}
},
"definitions": {
"expr": {
"properties": {
"attr": {
"title": "attribute"
},
"val": {
"title": "val"
}
},
"required": ["val", "attr"],
"oneOf": [
{
"properties": {
"attr": {"enum": ["a","b"]},
"val": {"type": "integer"}
}
},
{
"properties": {
"attr": {"enum": ["x"]},
"val": {"type": "boolean"}
}
},
{
"properties": {
"attr": {"pattern": "^[-A-Za-z0-9_]*$", "maxLength": 255},
"val": {"type": "string"}
}
}
]
}
},
"additionalProperties": false,
"required": [
"name",
"attribute"
]
}
Проблема заключается в том, что свойства, для которых я пытаюсь ограничить тип значения, также соответствуют общему формату. поэтому, когда я ожидаю целочисленное значение, оно передается со строковым значением.
Например:
приведенный ниже json передаст схему на основе первого элемента oneOff
{
"name": "shouldpass",
"attribute": {
"attr": "a",
"val": 1
}
}
нижеприведенный json пройдет на основе последнего элемента oneOff.
{
"name": "shouldpass2",
"attribute": {
"attr": "h",
"val": "asd"
}
}
приведенный ниже json должен завершиться ошибкой на основе первого элемента oneOff, но он также проходит, потому что он соответствует последнему элементу oneOff.
{
"name": "shouldfail",
"attribute": {
"attr": "a",
"val": "string"
}
}
как этого добиться?