Объект JSON tv4 действителен, если true и если другой объект присутствует
Можно проверить JSON, если значение объекта равно true, тогда этот объект является действительным, и если Obj2.included == true допустимо, если Obj1.included == true?
Это небольшой фрагмент схемы:
'attachments': {
'type': 'object',
'properties': {
'ZalA': {
'type': 'object',
'properties': {
'included': {
'type': 'boolean'
},
'version': {
'type': 'integer'
}
},
'required': [
'included',
'version'
]
},
'ZalB': {
'type': 'object',
'properties': {
'version': {
'type': 'integer'
},
'included': {
'type': 'boolean'
},
'required': [
'included',
'version'
]
}
}
}
}
Я хотел бы проверить:
- если ZalA.included == true, то действует.
- если ZalA.included == true и ZalB.included == true, то действует.
- если ZalA.included == false и ZalB.included == true, тогда недействительно.
Можно ли проверить эти ограничения с помощью валидатора tv4 JSON?
1 ответ
У меня есть решение для вас. Но прежде всего вы допустили небольшую ошибку в своей схеме из-за обязательного свойства, которое было в свойствах:
'ZalB': {
'type': 'object',
'properties': {
'version': {
'type': 'integer'
},
'included': {
'type': 'boolean'
},
'required': [
'included',
'version'
]
}
}
Когда вы используете его, вы должны определить его снаружи до или после свойств. Как вы сделали это с ZalA:) в противном случае это не работает.
Теперь к вашему ответу я провел небольшой эксперимент с этим очень интересным валидатором и придумал следующее:
// schema to be used for validating
var schema = {
'type': 'object',
'properties': {
'ZalA': {
'type': 'object',
'properties': {
'included': {
'type': 'boolean',
'enum': [
true
]
},
'version': {
'type': 'integer'
}
},
'required': [
'included',
'version'
]
},
'ZalB': {
'type': 'object',
'properties': {
'version': {
'type': 'integer'
},
'included': {
'type': 'boolean',
'enum': [
true
]
}
},
'required': [
'included',
'version'
]
},
'required': [
'ZalA'
],
}
};
// data to be checked against
var data = {
'ZalA': {
'version': 1,
'included': true
},
'ZalB': {
'version': 2,
'included': true
}
}
tv4.validateResult(data, schema); // Object { missing=[0], valid=true, error=null}
Схема должна быть настроена так, чтобы она соответствовала вашему контрольному списку:
если ZalA.included == true, то действует.
'required': [ 'ZalA' ],
Требует ZalA в конце схемы после свойств, так что ZalA должен присутствовать, чтобы вы могли повторять эту опцию так часто, как вы хотите на каждом уровне. Но это не достаточно для выполнения вашего контрольного списка. Следующие конфигурации:
'required': [ 'included', 'version' ]
плюс
'included': { 'type': 'boolean', 'enum': [true] },
включенный -property (и фактически версия -property, это уже было в вашем вопросе) ZalA должен присутствовать и быть истинным, чтобы ZalA мог считаться действительным. Вы можете определить массив различных типов, чтобы проверить, имеет ли свойство определенное значение, или вы можете использовать pattern -option.
Эти конфигурации применяются и для ZalB, но с одним отличием:
'required': [
'ZalA'
],
Требуется только ZalA, а не ZalB в конце.
И мы сделали! С этими конфигурациями выполняются все ваши следующие условия:
- если ZalA.included == true и ZalB.included == true, то действует.
- если ZalA.included == false и ZalB.included == true, тогда недействительно.
И если ZalB.included предоставляется как false, так и true, просто сделайте это:
'enum': [
true, false
]
Или полностью опустите опцию enum, чтобы в первую очередь она была логической.
Это действительно хороший валидатор. Спасибо за ваш вопрос, я буду использовать его для будущих проектов.
PS Вы можете сэкономить время, чтобы определить вторую схему для ZalB и просто сослаться (используя $ ref) на схему для ZalA, но я не проверял это. С другой стороны, вы можете использовать эту маленькую схему:
var schema = {
'type': 'object',
'properties': {
'included': {
'type': 'boolean',
'enum': [
true
]
},
'version': {
'type': 'integer'
}
},
'required': [
'included',
'version'
]
};
И используйте это так:
// a bundle of objects to be checked
var data = [{
'version': 1,
'included': true
},{
'version': 2,
'included': true
}];
// iterate through each object
for(var i=0; i < data.length;i++){
var obj = data[i];
// validate each object
var result = tv4.validateResult(obj, schema);
if(!result.valid){
console.log("not valid: ",result.error);
}
}
Я просто говорю за себя, но для меня это самая важная сторона документации валидатора. Поскольку он содержит все параметры, которые вы можете определить для определенных свойств, которые будут проверены: