验证包含一个of关键字的json模式

验证包含一个of关键字的json模式,json,validation,jsonschema,Json,Validation,Jsonschema,我的web应用程序有以下json模式 { "type":"object", "properties": { "person_identifier":{ "type":"object", "oneOf":[ {"$ref":"#/person_identifier/rememberme_id"}, {"$ref":"#/person_identifier/email"},

我的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请求中的三个“个人标识符”中的一个,即电子邮件、记忆id或帐号。我无法验证上述模式是否会强制执行所需的约束。 我尝试在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));
例如,JSFIDLE在不应该满足模式的情况下验证数据是否正确满足模式。只允许一个输入标识符。我已经参考了几乎所有关于使用其中一个的可用问题和文档。有没有关于我做错了什么的指示?谢谢。

使用 我能为我的问题制定出两个答案。以下是链接: 及

我问题中的模式不正确。该模式意味着匹配(所有三个参考)中的一个,电子邮件,记忆id,买家账号。数据(email和rememberme_id)与person_标识符的email和rememberme_id子资源(单独)匹配。它们与关键字oneOf一起单独出现,因此oneOf从未起作用

使用简单的解释 我理解我的错误。对于其中一个复杂的示例,与上一个链接中提到的示例不同,我们可以在所有子模式中使用一个公共的“属性”,该属性将受到oneOf关键字的限制(“我在上面发布的答案链接中的identifierType”)。这是至关重要的,有这个共同但有区别的因素,使一个工作。此外,我们所引用的其中一个模式中的子模式应该完全存在于oneOf数组(Answer2)中,或者作为引用(Answer1)传递。它们不能和其中一个用逗号分隔,因为这违背了目的(我犯的错误)。我通过@cloudfeet将答案引用到 问题

希望这有帮助