繁体   English   中英

验证具有oneOf关键字的json模式

[英]validation of json schema having oneOf keyword

我的Web应用程序具有以下json模式。

{  
  "type":"object",
    "properties": {
     "person_identifier":{
        "type":"object",
        "oneOf":[
               {"$ref":"#/person_identifier/rememberme_id"},
               {"$ref":"#/person_identifier/email"},
               {"$ref":"#/person_identifier/account_number"}
        ],
        "email":{
            "type":"string"
        },
        "rememberme_id":{
            "type":"string"
        },
        "account_number":{
            "type":"string"
        }    
       }
    }
}

我的目标是仅接受对我的应用程序的api请求中的三个“ person_identifier”电子邮件,rememberme_id或account_number之一。 我无法验证上述架构将强制执行所需的约束。 我尝试在jsfiddle.com上进行验证,但它表明我的架构未正确验证输入。 这是我在jsfiddle.com上进行验证的代码:

var data, schema;

schema = {  
     person_identifier:{
           type:'object',
           'oneOf':[
               {$ref:'#/person_identifier/rememberme_id'},
               {$ref:'#/person_identifier/email'},
               {$ref:'#/person_identifier/buyer_account_number'}
           ],
        'email':{
            type:'string'
        },
        'rememberme_id':{
            type:'string'
        },
        'account_number':{
            type:'string'
        }    
       }
};

data = {
  person_identifier: {
    email: 'abc@abc.com',
    rememberme_id: '1345'
  }
};

alert('Validation: ' + tv4.validate(data, schema, true));

例如,jsfiddle验证数据是否正确满足了模式(如果不正确)。 仅应允许一个输入标识符。 我已经介绍了有关使用oneOf的几乎所有可用问题和文档。 关于我做错了什么的任何指示? 谢谢。

使用http://geraintluff.github.io/tv4/try/我可以为我的问题提出两个答案。 这里是链接: 正确答案为ANSWER2

我的问题中的模式不正确。 该模式意味着匹配oneOf(所有三个引用),电子邮件,rememberme_id,buyer_account_number。 数据(电子邮件和Rememberme_id)与person_identifier的电子邮件和Rememberme_id子资源(分别)匹配。 它们与oneOf关键字分开出现,因此oneOf从未奏效。

使用来自http://www.asbjornenge.com/wwc/json_schema.html的简单解释,我理解了我的错误。 对于复杂的oneOf示例,与上一个链接中提到的示例不同,我们可以在所有打算由oneOf关键字限制的子方案中使用通用的“属性”(我上面发布的答案链接中的“ identifierType”)。 拥有使oneOf发挥作用的共同但有区别的因素至关重要。 另外,我们所引用的oneOf中的子模式应该完全存在于oneOf数组(Answer2)内部,或者作为引用传递(Answer1)。 它们不能与oneOf逗号分隔,因为它破坏了目的(我犯的错误)。 我将@cloudfeet的答案提到了这个问题。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM