2015-04-01 138 views
0

我从http://json-schema.org/examples.html得到了下面的模式,我想知道所需的关键字是否只能来自顶层。或者如果存在object类型的属性,它也可以进入属性内。在规范http://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.4.3中找不到与此相关的任何事物。JSON模式中的“required”关键字

{ 
    "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" 
    ] 
} 
+0

你的嵌套'required'在错误的地方。它需要成为“物业”的同伴,而不是孩子。你在最高级别做对了,所以我确信这只是打字错误。 – Jason 2015-04-07 18:41:50

回答

1

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

所以我看到,是的,你可以有那些在任何级别,但验证应要求

+0

所以我最近的编辑是一个有效的模式,它需要多个层次。 – user2478236 2015-04-01 12:35:37

+0

这个答案是错误的。验证确实可以递归地工作。事实上,如果这个引用意味着你认为它的作用,那么JSON Schema验证将是无用的。假定您正在验证其项目必须匹配给定模式的数组。如果这些项不验证,验证不会在'items'关键字上失败,它将在整个数组验证中失败。引用意味着关键字只负责确定要针对哪种模式进行验证。它不负责对模式进行验证。这发生在另一个步骤。 – Jason 2015-04-07 18:27:06

+0

@Jason,你能详细说明一下吗,我无法理解数组项目的验证,如果你可以共享一个简单的模式与数组验证,它会更清楚。 – user2478236 2015-04-08 16:09:15

0

required关键字可以存在于任何模式。所有模式关键字都是如此。

(有一个特殊的情况下为所述元关键字$schema,为此它是可取到仅具有在顶级)

0

是,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" 
    ] 
}