【问题标题】:"required" keyword in JSON schemaJSON模式中的“必需”关键字
【发布时间】:2015-06-06 00:41:21
【问题描述】:

我从http://json-schema.org/examples.html 获得了以下架构,我想知道 required 关键字是否只能出现在顶层。或者,如果有对象类型的属性,它也可以包含在属性中。我在规范 https://datatracker.ietf.org/doc/html/draft-fge-json-schema-validation-00#section-5.4.3 中找不到与此相关的任何内容。

{
    "title": "Example Schema",
    "type": "object",
    "properties": {
        "firstName": {
            "type": "string"
        },
        "lastName": {
            "type": "string"
        },
        "age": {
            "description": "Age in years",
            "type": "integer",
            "minimum": 0
        }
    },
    "required": ["firstName", "lastName"]
}

所以下面的例子是一个有效的模式

{  
   "title":"Example Schema",
   "type":"object",
   "properties":{  
      "firstName":{  
         "type":"string"
      },
      "lastName":{  
         "type":"string"
      },
      "age":{  
         "type":"object",
         "properties":{  
            "minAge":{  
               "type":"number"
            },
            "maxAge":{  
               "type":"number"
            },
            "required":[  
               "minAge",
               "maxAge"
            ]
         }
      }
   },
   "required":[  
      "firstName",
      "lastName"
   ]
}

【问题讨论】:

  • 您的嵌套required 放错了位置。它需要是properties 的对等体,而不是孩子。您在顶层是正确的,所以我确定这只是错字。

标签: json jsonschema


【解决方案1】:

4.4 可以验证容器实例的关键字(数组 或对象)仅验证实例本身而不是它们的 子项(数组项或对象属性)。

所以我认为是的,您可以在任何级别上进行验证,但应仅在所需的同一级别上考虑验证

【讨论】:

  • 所以我最新的编辑是一个有效的模式,它需要多个级别。
  • 这个答案是错误的。验证确实以递归方式工作。事实上,如果这句话的意思是你认为的那样,那么 JSON Schema 验证将毫无用处。假设您正在验证其项目必须与给定模式匹配的数组。如果这些项目不验证,验证不会在 items 关键字上失败,它会在整个数组验证上失败。引号的意思是关键字只负责确定要验证的架构。它不负责根据模式进行验证。这发生在另一个步骤中。
  • @Jason,您能否详细说明一下,我无法理解数组项的验证,如果您可以与数组验证共享一个简单的模式,那就更清楚了。
  • @user2478236,很难在评论中详细说明。我建议你使用jsonschemalint 创建一些模式,看看它们如何验证示例数据。
  • @Jason " 事实上,如果这句话的意思是你认为的那样,JSON Schema 验证将毫无用处。" - 似乎它只是意味着应该在 上执行相同的验证级别。这可以得出这样的结论:每个级别都应该有自己的“必需”规则——这些规则回答了问题并且看起来确实是正确的。
【解决方案2】:

required 关键字可以出现在任何架构中。所有架构关键字都是如此。

(元关键字$schema 有一个特殊情况,建议只在顶层使用)

【讨论】:

    【解决方案3】:

    是的,required 是任何架构中的有效关键字。嵌套模式没有限制。

    要使用您的示例,以下是一个有效的架构,并将验证您想要的方式。

    {  
        "title": "Example Schema",
        "type": "object",
        "properties": {  
            "firstName": {  
                "type": "string"
            },
            "lastName": {  
                "type": "string"
            },
            "age": {  
                "type": "object",
                "properties": {  
                    "minAge": {  
                        "type": "number"
                    },
                    "maxAge": {  
                        "type": "number"
                    }
                },
                "required": [  
                    "minAge",
                    "maxAge"
                ]
            }
        },
        "required": [  
            "firstName",
            "lastName"
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-17
      • 1970-01-01
      • 2015-10-20
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多