当前位置: 首页 > 知识库问答 >
问题:

为什么“additionalProperties”是在Swagger/OpenAPI 2.0中表示字典/地图的方式

巫健柏
2023-03-14

虽然我看过OpenAPI规范中的例子:

type: object
additionalProperties:
  $ref: '#/definitions/ComplexModel'

我不明白为什么使用additionalProperties是地图/字典的正确模式。

规范中关于addtionalProperties的唯一具体内容是:

以下属性取自JSON模式定义,但它们的定义已根据Swagger规范进行了调整。它们的定义与JSON模式中的定义相同,只有在原始定义引用JSON模式定义的情况下,才会使用模式对象定义。

  • 项目
  • allOf
  • 属性
  • 附加属性

共有2个答案

赵健柏
2023-03-14

首先,我找到了一个更好的解释addtionalProperties

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

我终于明白了这一点:

使用属性,我们可以定义一组类似于Python的命名元组的已知属性,但是如果我们希望有更像Python的判决,或者任何其他哈希/映射,我们不能指定有多少个键,也不能预先指定它们是什么,我们应该使用addtionalProperties

additionalProperties将匹配任何属性名称(将充当dict的键,$reftype将是dict值的模式,并且由于每个给定对象不应有多个具有相同名称的属性,因此我们将强制执行唯一键。

请注意,与Python的dict不同,它接受任何不可变的值作为键,因为这里的键本质上是属性名,它们必须是字符串。(感谢特德·爱泼斯坦的澄清)。这个限制可以追溯到json规范中的pair:=string:value

傅毅然
2023-03-14

陈,我认为你的答案是正确的。

一些可能有用的进一步背景:

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

JSON模式使用properties关键字验证预先已知的名称-值对;并使用附加属性(或模式属性,OpenAPI 2.0不支持)验证未知属性。

为清楚起见:

  • 属性名或映射中的键必须是字符串,不能是数字或任何其他值。
  • 如你所说,属性名应该是唯一的。不幸的是,JSON规范并没有严格要求唯一性,但是唯一性是推荐的,也是大多数JSON实现所期望的。这里有更多的背景。
  • 属性addtionalProperties可以单独使用,也可以组合使用。当addtionalProperties单独使用时,没有属性,对象基本上起到map的作用

 类似资料:
  • 问题内容: 我知道映射是将键映射到值的数据结构。字典不一样吗?地图和字典1有什么区别? 1.我不是要问用X或Y语言定义它们(这似乎是人们通常在SO上要求的语言),我想知道它们在理论上有何不同。 问题答案: 同一件事的两个术语: Java,C ++使用“地图” .Net,Python使用“字典” PHP使用“关联数组” “映射”是正确的数学术语,但是避免使用它,因为它在函数式编程中具有单独的含义。

  • 问题内容: 我不明白为什么编译器从字典中打印值会有所不同?我使用的是Swift 3,Xcode8。这是错误还是优化内容的怪异方法? 编辑 更奇怪的是: 有些价值观过去了,有些则跌破了,有些则保持不变!1.1小于1.1000000000000001,而2.3大于2.2999999999999998,1.2仅为1.2 问题答案: 如注释中已经提到的,a 不能精确存储值。Swift根据IEEE 754

  • 有一个问题,为什么他们要求在字典中使用不可变对象作为键。 当我最近使用字典(显然不是为了哈希表)将Xml节点对象作为键放置时,这个问题实际上进入了我的脑海。然后,我在使用过程中多次更新节点。 那么,“使用不可变键”到底意味着什么呢?

  • 问题内容: 如果我想将的结果(即对象)与需要字典或类映射对象的方法一起使用(请参见collections.Mapping),那么正确的方法是什么? “进入”对象并使用其属性是否合适? 我认为答案是否定的:闻起来像执行公约,而不是一个接口,方式或或似乎是。 问题答案: 您可以使用 vars() 访问名称空间的字典: 您可以根据需要直接修改字典: 是的,可以访问__dict__属性。这是定义明确,经过

  • 问题内容: 我试图代表一个简化的染色体,该染色体由N个碱基组成,每个碱基只能是的一个。 我想用一个枚举形式化约束,但是我想知道在Go语言中最惯用的枚举方式是什么。 问题答案: 引用语言规范:Iota 在常量声明中,预声明的标识符iota表示连续的无类型整数常量。每当保留字const出现在源中时,它将重置为0,并在每个ConstSpec之后递增。它可以用来构造一组相关的常量: 在Expression

  • 我试图从spring批处理应用程序中的读取列表映射 我没有读到spring是如何解析值的,但有办法做到这一点吗? 另外,是从读取列表映射的好方法吗?