基于数据的AJV条件模式验证 [英] ajv conditional schema validation based on data
本文介绍了基于数据的AJV条件模式验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想根据一个字段中的数据为另一个字段指定regexp模式。这个是可能的吗?我尝试过switch和$data,但不确定如何使用它们。 例如,如果数据如下:
{
"contacts":[
{
"mode":"Email",
"contact":"john.doe@abc.com"
},
{
"mode":"Phone",
"contact":"111-555-1234"
}
]
}
架构类似于:
"$schema":"http://json-schema.org/draft-04/schema#",
"type":"object",
"properties":{
"Contacts":{
"type":"array",
"minItems":1,
"items":{
"type":"object",
"properties":{
"mode":{
"type":"string",
"enum":[
"Email",
"Phone"
]
},
"contact":{
"type":"string",
"pattern":"?????"
}
},
"required":[
"mode",
"contact"
]
}
}
}
}
如何根据模式中的数据设置联系人模式,以便如果模式为电子邮件,则根据电子邮件格式的regexp验证联系人;如果模式为电话,则根据电话格式的regexp验证联系人?我有每个函数的regexp。我需要选择其中一个的逻辑。
推荐答案
有多种方法
任何(优点:Draft-04兼容,缺点:错误报告有点冗长-如果两个子架构都不匹配,您将收到错误):
{
"type": "object",
"properties": {
"Contacts": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"anyOf": [
{
"properties": {
"mode": {"enum": ["Email"]},
"contact": {
"type": "string",
"format": "email"
}
}
},
{
"properties": {
"mode": {"enum": ["Phone"]},
"contact": {
"type": "string",
"pattern": "phone_pattern"
}
}
}
],
"required": ["mode", "contact"]
}
}
}
}
IF/Then/Else(available in ajv-keywords package,优点:错误报告更有意义,accepted to be included in draft-07,缺点:目前不标准):
{
"type": "object",
"properties": {
"Contacts": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"mode": {"type": "string", "enum": ["Email", "Phone"]},
"contact": {"type": "string"}
},
"if": {
"properties": {
"mode": {"enum": ["Email"]}
}
},
"then": {
"properties": {
"contact": {"format": "email"}
}
},
"else": {
"properties": {
"contact": {"pattern": "phone_pattern"}
}
}
"required": ["mode", "contact"]
}
}
}
}
SELECT(available in ajv-keywords package,优点:比IF/THEN/ELSE更简洁,特别是如果有两个以上的可能值,缺点:not on the standard track yet,但您可以支持:),需要启用$Data Reference和Ajv v5.x.x):
{
"type": "object",
"properties": {
"Contacts": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"mode": {"type": "string"},
"contact": {"type": "string"}
},
"select": { "$data": "0/mode" },
"selectCases": {
"Email": {
"properties": {
"contact": {"format": "email"}
}
},
"Phone": {
"properties": {
"contact": {"pattern": "phone_pattern"}
}
}
},
"selectDefault": false,
"required": ["mode", "contact"]
}
}
}
}
我更喜欢最后一个选项。
这篇关于基于数据的AJV条件模式验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文