虽然我已经看到了OpenAPI spec中的例子:
类型:对象
additionalProperties:
$ ref:'#/ definitions / ComplexModel'
对我来说,为什么使用 additionalProperties
是Map / Dictionary的正确模式并不明显 .
对于 additionalProperties
规范唯一具体的事情是,它也无济于事:
以下属性取自JSON Schema定义,但其定义已调整为Swagger规范 . 它们的定义与JSON Schema中的定义相同,只有在原始定义引用JSON模式定义的情况下,才使用模式对象定义 . items allOf属性additionalProperties
2 回答
陈,我觉得your answer是对的 .
一些可能有用的背景:
在JavaScript中,它是JSON的原始上下文,对象就像字符串到值的哈希映射,其中一些值是数据,其他值是函数 . 您可以将每个名称 - 值对视为属性 . 但JavaScript没有类,因此属性名称不是预定义的,每个对象都可以拥有自己独立的属性集 .
JSON Schema使用
properties
关键字来验证事先已知的名称 - 值对;并使用additionalProperties
(或patternProperties
,OpenAPI 2.0不支持)来验证未知的属性 .为清楚起见:
Map 中的属性名称或"keys"必须是字符串 . 它们不能是数字或任何其他值 .
如您所说,属性名称应该是唯一的 . 不幸的是,JSON规范并不严格要求唯一性,但建议使用唯一性,并且大多数JSON实现都需要这种唯一性 . 更多背景here .
properties
和additionalProperties
可单独使用或组合使用 . 当单独使用additionalProperties而没有属性时,该对象本质上充当map<string, T>
,其中T是additionalProperties子模式中描述的类型 . 也许这有助于回答您的原始问题 .在针对单个模式评估对象时,如果属性名称与
properties
中指定的属性名称匹配,则其值仅需要针对为该属性提供的子模式有效 .additionalProperties
子模式(如果提供)仅用于验证properties
映射中未包含的属性 .在Swagger 's core Java libraries. I'中实现了
additionalProperties
的一些限制,记录了这些限制here .首先,我找到了better explanation for additionalProperties:
所以这就是我最终如何理解这一点:
使用
properties
,我们可以定义一组类似于Python's namedtuple的已知属性,但是如果我们希望有更像Python's dict或任何其他哈希/ Map 的地方,我们无法指定它们有多少键,也不能提前它们是什么,我们应该使用additionalProperties
.additionalProperties
将匹配任何属性名称(将作为dict
的键,$ref
或type
将是dict
的值的架构,并且因为每个给定的名称不应有多个属性对象,我们将获得唯一键的强制执行 .请注意,与Python的
dict
不同,它接受任何不可变值作为键,因为这里的键本质上是属性名称,它们必须是字符串 . (谢谢Ted Epstein澄清) . 可以在json specification中将此限制追踪到pair := string : value
.