2017-08-08 45 views
2

鉴于以下OpenAPI定义,下列哪些对象是有效的。只是1.或1.和2.?OpenAPI中的'required'是什么意思

Person: 
    required: 
    - id 
    type: object 
    properties: 
    id: 
     type: string 
  1. {"id": ""}
  2. {"id": null}
  3. {}

这归结为是否 “需要=真” 的问题是指 “非空” 或“属性必须在场“。

JSON模式验证器https://json-schema-validator.herokuapp.com/说,2.无效,因为null不符合type: string约束。请注意,它不会投诉,因为id为空,但是因为null不是字符串。但是这对于OpenAPI/Swagger有多相关?

回答

4

在所述OpenAPI的required关键字的含义相同JSON Schema

需要

对象实例被针对该关键字有效的,如果它的属性集包含在这个关键字的数组值的所有元素。

latest JSON Schema spec的措辞(虽然它不是由OpenAPI的使用的)是比较明确的:

一个对象实例就是在这样的关键字,如果数组中的每一个产品的名称有效在实例中的一个属性。

也就是说,required意味着“属性必须存在”,无论值如何。属性值的type,format等是单独的约束条件,与required分开进行评估,但共同作为组合模式。

在您的例子:

  1. {"id": ""}是有效的:

    • ✓验证对required
    • ✓值""验证对type: string
  2. {"id": null}是无效的:

    • ✓验证对required
    • null不验证对type: string
  3. {}是无效的:

    • ✗不验证对required

注意null作为一种类型的不OpenAPI的支持,但是所述OpenAPI 3.0添加nullable属性,以指示该值可以是null。因此,{"id": null}将验证此OpenAPI 3.0架构:

Person: 
    required: 
    - id 
    type: object 
    properties: 
    id: 
     type: string 
     nullable: true # <---- 
+0

很好的答案,谢谢。不是你的错,JSON模式规范不符合'null'的JavaScript/JSON概念。 –

+0

@MarcelStörJSON模式具有'null'类型,可以将一个可以为空的模式定义为'{“type”:[“string”,“null”]}''。但OpenAPI不支持'type:null',而是使用'nullable'属性。 – Helen

1

OpenAPI按照这些事项推迟JSON模式,并且从我在JSON Schema中可以看出的结果null是一个有效的字符串。

应该注意,nul字符(\ u0000)在JSON 字符串中有效。

我读到的required的定义是属性的存在意味着有效性。


更新:它看起来像我错了。看起来JSON Schema不认为null的值等于\ u0000。这将意味着null不是字符串的有效值。

+0

谢谢! “有效......如果数组中的每个项目都是实例中某个属性的名称”似乎表明'{“id”:null}'确实有效。然而,由于'null'与nul字符并不完全相同,所以我必须编写'{“id”:“\ u0000”}来满足JSON模式验证器的要求 - 这又与'{ “id”:null}'。 –