可以验证JSON,如果object的值为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'
]
}
}
}
}
我想查一下:
是否可以使用tv4 JSON验证器检查这些约束?
答案 0 :(得分:2)
我有一个解决方案给你。但首先,您的架构中存在一些错误,因为属性中的必需 - 属性:
'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必须存在和< strong> true 以便ZalA可被视为有效。您可以定义不同类型的数组以检查属性是否具有特定值,或者您可以使用模式 -option。
这些配置也适用于ZalB,但有一点不同:
'required': [
'ZalA'
],
最后只需要ZalA而不是ZalB。
我们完成了!通过这些配置,您可以满足以下所有条件:
如果ZalB.included被授予虚假和真实,那么就这样做:
'enum': [
true, false
]
或者完全省略 enum -option,以便它首先必须是布尔值。
这确实是一个很好的验证器。谢谢你的问题,我将把它用于未来的项目。
P.S。您可以不必为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);
}
}
我只是为自己说话,但对我而言,这是验证者文档中最重要的一面。因为它包含您可以定义的某些属性的所有选项: