首页 文章

为什么`additionalProperties`是在Swagger / OpenAPI 2.0中表示Dictionary / Map的方法

提问于
浏览
16

虽然我已经看到了OpenAPI spec中的例子:

类型:对象
additionalProperties:
$ ref:'#/ definitions / ComplexModel'

对我来说,为什么使用 additionalProperties 是Map / Dictionary的正确模式并不明显 .

对于 additionalProperties 规范唯一具体的事情是,它也无济于事:

以下属性取自JSON Schema定义,但其定义已调整为Swagger规范 . 它们的定义与JSON Schema中的定义相同,只有在原始定义引用JSON模式定义的情况下,才使用模式对象定义 . items allOf属性additionalProperties

2 回答

  • 23

    陈,我觉得your answer是对的 .

    一些可能有用的背景:

    在JavaScript中,它是JSON的原始上下文,对象就像字符串到值的哈希映射,其中一些值是数据,其他值是函数 . 您可以将每个名称 - 值对视为属性 . 但JavaScript没有类,因此属性名称不是预定义的,每个对象都可以拥有自己独立的属性集 .

    JSON Schema使用 properties 关键字来验证事先已知的名称 - 值对;并使用 additionalProperties (或 patternProperties ,OpenAPI 2.0不支持)来验证未知的属性 .

    为清楚起见:

    • Map 中的属性名称或"keys"必须是字符串 . 它们不能是数字或任何其他值 .

    • 如您所说,属性名称应该是唯一的 . 不幸的是,JSON规范并不严格要求唯一性,但建议使用唯一性,并且大多数JSON实现都需要这种唯一性 . 更多背景here .

    • propertiesadditionalProperties 可单独使用或组合使用 . 当单独使用additionalProperties而没有属性时,该对象本质上充当 map<string, T> ,其中T是additionalProperties子模式中描述的类型 . 也许这有助于回答您的原始问题 .

    • 在针对单个模式评估对象时,如果属性名称与 properties 中指定的属性名称匹配,则其值仅需要针对为该属性提供的子模式有效 . additionalProperties 子模式(如果提供)仅用于验证 properties 映射中未包含的属性 .

    • 在Swagger 's core Java libraries. I'中实现了 additionalProperties 的一些限制,记录了这些限制here .

  • 19

    首先,我找到了better explanation for additionalProperties

    对于对象,如果给出了此对象,除了属性中定义的属性外,还允许所有其他属性名称 . 它们的值必须与此处给出的模式对象相匹配 . 如果没有给出,则不允许使用属性中定义的其他属性 .

    所以这就是我最终如何理解这一点:

    使用 properties ,我们可以定义一组类似于Python's namedtuple的已知属性,但是如果我们希望有更像Python's dict或任何其他哈希/ Map 的地方,我们无法指定它们有多少键,也不能提前它们是什么,我们应该使用 additionalProperties .

    additionalProperties 将匹配任何属性名称(将作为 dict 的键, $reftype 将是 dict 的值的架构,并且因为每个给定的名称不应有多个属性对象,我们将获得唯一键的强制执行 .

    请注意,与Python的 dict 不同,它接受任何不可变值作为键,因为这里的键本质上是属性名称,它们必须是字符串 . (谢谢Ted Epstein澄清) . 可以在json specification中将此限制追踪到 pair := string : value .

相关问题