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

时间:2014-05-30 22:39:55

标签: json validation jsonschema

我的网络应用程序有以下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”-email,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,我几乎提到了所有可用的问题和文档。关于我做错了什么的任何指示?谢谢。

1 个答案:

答案 0 :(得分:2)

使用http://geraintluff.github.io/tv4/try/ 我能够为我的问题制定两个答案。以下是链接:Answer1Answer2

我的问题中的架构不正确。架构意味着匹配oneOf(所有三个引用),email,rememberme_id,buyer_account_number。数据(email和rememberme_id)匹配person_identifier的电子邮件和rememberme_id子资源(单独)。它们与oneOf关键字一起分开存在,因此oneOf从未起作用。

使用http://www.asbjornenge.com/wwc/json_schema.html中的简单说明 我理解我的错误。对于复杂的一个例子,与上一个链接中提到的例子不同,我们可以使用一个共同的"属性"在所有旨在受oneOf关键字限制的子模式中(" identifierType"在我上面发布的答案链接中)。拥有这种共同但有区别的因素至关重要,这使得一个人工作。此外,我们引用的oneOf中的子模式应完全存在于oneOf数组(Answer2)中或作为引用传递(Answer1)。它们不能与oneOf一起逗号分隔,因为它违背了目的(我犯的错误)。我把@cloudfeet的答案提到this 题。

希望这有帮助。