我的网络应用程序有以下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,我几乎提到了所有可用的问题和文档。关于我做错了什么的任何指示?谢谢。
答案 0 :(得分:2)
使用http://geraintluff.github.io/tv4/try/ 我能够为我的问题制定两个答案。以下是链接:Answer1 和Answer2
我的问题中的架构不正确。架构意味着匹配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 题。
希望这有帮助。