JSON tv4 对象如果为真且存在其他对象则有效
JSON tv4 object valid if true and if other object is present
可以验证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 验证器检查这些约束?
我有一个解决方案给你。但首先你的模式有一点错误,因为 required-属性 在 properties:
'ZalB': {
'type': 'object',
'properties': {
'version': {
'type': 'integer'
},
'included': {
'type': 'boolean'
},
'required': [
'included',
'version'
]
}
}
当您使用它时,您必须在 properties 之前或之后在外部定义它。正如您使用 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}
必须配置架构,使其与您的清单相匹配:
if ZalA.included == true, then valid.
'required': [
'ZalA'
],
在属性之后的架构末尾需要 ZalA,以便 ZalA 必须存在,因此您可以在每个级别中根据需要重复此选项。但这还不足以完成您的清单。接下来的配置是:
'required': [
'included',
'version'
]
加上
'included': {
'type': 'boolean',
'enum': [true]
},
included-属性(实际上 version-属性 也一样,它已经在您的ZalA 的问题)必须是 present 和 true 以便 ZalA 可以被认为是有效的。您可以定义一个不同类型的数组来检查 属性 是否具有特定值,或者您可以使用 pattern-option.
这些配置也适用于 ZalB,但有一个区别:
'required': [
'ZalA'
],
最后只需要 ZalA,不需要 ZalB。
我们完成了!通过这些配置,您接下来的所有条件都得到满足:
- 如果 ZalA.included == true 且 ZalB.included == true,则有效。
- 如果ZalA.included == false 且ZalB.included == true,则无效。
如果 ZalB.included 既是真又是假的,那么就这样做:
'enum': [
true, false
]
或者完全省略 enum-选项,这样它首先必须是布尔值。
这确实是一个很好的验证器。感谢您的提问,我会将其用于未来的项目。
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);
}
}
我只是代表我自己说话,但对我来说这是验证器文档中最重要的一面。因为它包含您可以为要验证的某些属性定义的所有选项:
可以验证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 验证器检查这些约束?
我有一个解决方案给你。但首先你的模式有一点错误,因为 required-属性 在 properties:
'ZalB': {
'type': 'object',
'properties': {
'version': {
'type': 'integer'
},
'included': {
'type': 'boolean'
},
'required': [
'included',
'version'
]
}
}
当您使用它时,您必须在 properties 之前或之后在外部定义它。正如您使用 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}
必须配置架构,使其与您的清单相匹配:
if ZalA.included == true, then valid.
'required': [ 'ZalA' ],
在属性之后的架构末尾需要 ZalA,以便 ZalA 必须存在,因此您可以在每个级别中根据需要重复此选项。但这还不足以完成您的清单。接下来的配置是:
'required': [ 'included', 'version' ]
加上
'included': { 'type': 'boolean', 'enum': [true] },
included-属性(实际上 version-属性 也一样,它已经在您的ZalA 的问题)必须是 present 和 true 以便 ZalA 可以被认为是有效的。您可以定义一个不同类型的数组来检查 属性 是否具有特定值,或者您可以使用 pattern-option.
这些配置也适用于 ZalB,但有一个区别:
'required': [
'ZalA'
],
最后只需要 ZalA,不需要 ZalB。
我们完成了!通过这些配置,您接下来的所有条件都得到满足:
- 如果 ZalA.included == true 且 ZalB.included == true,则有效。
- 如果ZalA.included == false 且ZalB.included == true,则无效。
如果 ZalB.included 既是真又是假的,那么就这样做:
'enum': [
true, false
]
或者完全省略 enum-选项,这样它首先必须是布尔值。
这确实是一个很好的验证器。感谢您的提问,我会将其用于未来的项目。
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);
}
}
我只是代表我自己说话,但对我来说这是验证器文档中最重要的一面。因为它包含您可以为要验证的某些属性定义的所有选项: