【问题标题】:validation of json schema having oneOf keyword验证具有 oneOf 关键字的 json 模式
【发布时间】:2014-05-30 22:39:54
【问题描述】:

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

【问题讨论】:

    标签: json validation jsonschema


    【解决方案1】:

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

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      相关资源
      最近更新 更多