【发布时间】:2019-09-27 13:38:04
【问题描述】:
我想通过 AJV 执行的操作 - JSON 模式验证或自定义关键字(最好我会这样做):数组可以有 1 或 2 个 JSON 对象,类型为“admin”和“guest”。 "type":"guest" 对象将始终存在,并且 "type":"admin" 对象是可选的。
补充说明:
-对象本身将来可能包含附加属性和嵌套对象
-其他有效的枚举是superadmin、admin、user和guest
-数组中的类型顺序为:superadmin、admin、user和guest。是否可以检查顺序? (尽管它是可选的)
-'guest' 类型的对象将始终存在,并且会有一个唯一类型的对象。如果再次出现任何对象类型(例如超级管理员、管理员、用户和访客),那么它就是一个错误
//这里是架构:
{
"type": "object",
"properties": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": { "enum": ["guest", "admin"]
},
"rights": {"type": "string"},
"hyperLink": {"type": "string", "format": "uri"}
}
}
}
}
我需要在 json 中的某处添加 'checkTypeAndValue' 标志,以便我可以获取完整的 JSON 对象和相应的属性来进行编程检查?
const checkTypeAndValue = function (schema, completeJSONObj) {
//
};
ajv.addKeyword('checkTypeAndValue', {
validate: checkTypeAndValue,
errors: true
});
这里有一些有效和无效的例子:
/Valid 1: As type is 'admin' and so 'rights' SHOULD NOT be in 'guest' object
{
[
{
"type":"admin",
"hyperLink": "http://www.someguest.com",
"rights":"all"
},
{
"type":"guest",
"hyperLink": "http://www.someadmin.com"
}
]
}
//Valid 2: You can have a SINGLE 'guest' object. 'admin' object is not required all the time
{
[
{
"type":"guest",
"hyperLink": "http://www.someadmin.com",
"rights": "limited" //MANDATORY or REQUIRED Attribute
}
]
}
//InValid
{
[
{
"type":"admin",
"hyperLink": "http://www.someguest.com",
"rights":"all"
},
{
"type":"guest",
"hyperLink": "http://www.someadmin.com",
"rights":"limited"
//Error ==> As rights=all is there in 1st object, you cannot set 'rights' to any value including blank even having 'rights' attribute is not valid.
}
]
}
这是我需要整理的 if else 条件:
//Assuming admin object exist with rights....
if( type == admin && rights != ""){
if(type == guest && rights attribute is there && rights != ""){
//The 'guest' object will always be there....
//error: guest 'rights' cannot have a value if type is 'admin' and rights is 'all' or any other value.
}
}else{
//Assuming mandatory guest object exist with rights....
if(guest.rights does not exist OR guest.rights == "")
//Error: 'rights' is MANDATORY attribute in guest block and error if its empty
else
//Everything is fine
}
还有什么方法可以让我们在数组中检查是否只有一对特定类型的对象? 例如:只有一种 'guest、'admin' 类型。错误,如果有不止一种类型的 'guest' 或 'admin'
//完整示例
{
[
{
"type":"superadmin",
"hyperLink": "http://www.superadmin.com"
},
{
"type":"admin",
"hyperLink": "http://www.admin.com",
"rights":"all"
},
{
"type":"user",
"hyperLink": "http://www.user.com"
},
{
"type":"guest",
"hyperLink": "http://www.guest.com"
}
]
}
【问题讨论】:
-
我认为仅使用纯 JSON Schema 就可以做到这一点。只是为了澄清,您的数组是否只有两个对象,或者它们可能有超过 2 个?顺序是已知的还是未知的(不是问题,但解决方案可能不同)?
-
其实没什么区别。为您找到解决方案。
-
数组可以有更多的对象作为更新的问题。如果我们能管理订单就好了。正如您所提到的,这可能很棘手,这是否是 ajv 自定义验证可以提供帮助的一种方式?感谢回复
-
啊,如果有管理员,那么没有其他类型可能有权限?
-
现在关系是'admin'类型和'guest'类型。不知道以后这种关系有没有变化。如何进行自定义 ajv 验证以适应任何近期架构更改以适应这种复杂性
标签: json jsonschema json-schema-validator ajv