JSON tv4 对象在 true 且存在其他对象时有效
JSON tv4 object valid if true and if other object is present
可以验证JSON,如果对象的值为真,则此对象有效,如果Obj2.include == true有效,如果Obj1.include == 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.include == true,则有效。
- 如果 ZalA.include == true 和 ZalB.include == true,则有效。
- 如果 ZalA.include == false 和 ZalB.include == true,则无效。
是否可以使用 tv4 JSON 验证器检查这些约束?
解决方案给你。但首先,您的架构中有一个小错误,因为属性中的必需属性:
'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.include == true,则有效。
'required': [ 'ZalA' ],
要求在属性之后的架构末尾使用 ZalA,以便 ZalA 必须存在,因此您可以在每个级别中根据需要重复此选项。但这不是完成你的清单的enougth。接下来的配置是:
'required': [ 'included', 'version' ]
加
'included': { 'type': 'boolean', 'enum': [true] },
ZalA 的包含属性(实际上也是版本属性,它已经在您的问题中)必须存在并且为真,以便 ZalA 可以被认为是有效的。您可以定义不同类型的数组来检查属性是否具有特定值,也可以使用模式选项。
这些配置也适用于ZalB,但有一个区别:
'required': [
'ZalA'
],
最后只需要 ZalA,而不是 ZalB。
我们完成了!通过这些配置,将满足所有后续条件:
- 如果 ZalA.include == true 和 ZalB.include == true,则有效。
- 如果 ZalA.include == false 和 ZalB.include == true,则无效。
如果ZalB.include被授予为假和真,那么只需这样做:
'enum': [
true, false
]
或者完全省略枚举选项,以便它首先必须是布尔值。
这真的是一个很好的验证器。感谢您的问题,我将将其用于未来项目。
附言您可以不遗余力地为 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);
}
}
我只是为自己说话,但对我来说,这是验证器文档最重要的方面。因为它包含您可以为要验证的某些属性定义的所有选项:
http://json-schema.org/latest/json-schema-validation.html
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- 使用同一对象中的其他变量声明变量
- 别名或以其他方式合并两个具有不同名称的相同对象原型
- 如何使用object.assign()从其他对象引用基本对象属性
- 对象获胜'如果qml中的其他地方定义了数字动画属性,则t设置动画
- 如何使用其他地方指定的访问信息访问嵌套的json对象,而不使用eval或迭代
- 对象数组-与其他列数据相比,增加一列
- PJAX:记住其他对象状态
- 以编程方式将fabric-js-canvas的图像替换为hq图像,并重新计算其他对象的坐标和大小
- AngularJS:根据其他对象预先选择ng repeat中的select元素
- 如何在 JavaScript 中访问函数中的其他属性值作为对象属性值
- 如何在 Javascript 中向数组添加其他对象
- 追加子数据 URI,替换 IE 中的其他对象
- 将 JavaScript 对象转换为其他格式
- 挖空、视图模型位于其他对象和数据绑定中
- 如何从帖子对象添加其他信息以在护照中注册用户
- getList 的响应应该是一个数组,而不是一个对象或其他东西
- 函数中的If语句会创建其他对象
- 如何在 javascript 中将变量传递给对象内的其他函数
- 将JSON对象转换为敲除observable在IE8中不起作用,但在所有其他浏览器中都起作用