如何在“map”对象中编写 OpenAPI 3 (Swagger) 规范的属性名称?

2023-12-26

我试图描述的 API 具有一个结构,其中根对象可以包含任意数量的子对象(属性本身就是对象)。根对象中的“键”或属性是子对象的唯一标识符,值是子对象的其余数据。

{
  "child1": { ... bunch of stuff ... },
  "child2": { ... bunch of stuff ... },
  ...
}

这可以类似地建模为数组,例如:

[
  { "id": "child1", ... bunch of stuff ... },
  { "id": "child2", ... bunch of stuff ... },
  ...
]

但这都使得在结构上不太清楚识别属性是什么,并且使子 ID 之间的唯一性变得隐式而不是显式,因此我们想要使用一个对象或一个映射。

我看过 Swagger 文档具有地图/字典属性的模型 https://swagger.io/specification/#model-with-map-dictionary-properties-106,但这并不足以适合我的用例。写一些类似的东西:

"Parent": {
  "additionalProperties": {
    "$ref": "#/components/schemas/Child",
  }

产生这样的结果:

这充分传达了属性中值的描述性,但如何记录对象中“键”的限制?理想情况下,我想说“这不仅仅是任意字符串,它是与孩子相对应的 ID”。这是否以任何方式得到支持?


你的例子是正确的。


如何记录对象中“键”的限制?理想情况下,我想说“这不仅仅是任意字符串,它是与孩子相对应的 ID”。这是否以任何方式得到支持?

开放API 3.1

OAS 3.1 完全支持 JSON Schema 2020-12,包括patternProperties https://json-schema.org/understanding-json-schema/reference/object.html#pattern-properties。此关键字允许您使用正则表达式定义字典键的格式:

"Parent": {
  "type": "object",
  "patternProperties": {
    "^child\d+$": {
      "$ref": "#/components/schemas/Child"
    }
  },
  "description": "A map of `Child` schemas, where the keys are IDs that correspond to the child"
}

或者,如果属性名称是由枚举定义的,您可以使用propertyNames https://json-schema.org/understanding-json-schema/reference/object.html#id4定义该枚举:

"Parent": {
  "type": "object",
  "propertyNames": {
    "enum": ["foo", "bar"]
  },
  "additionalProperties": {
    "$ref": "#/components/schemas/Child"
  }
}

OpenAPI 3.0 和 2.0

字典键被假定为字符串,但无法限制键的内容/格式。您可以在架构中口头记录任何限制和细节description。添加架构示例可以帮助说明您的字典/地图可能是什么样子。

"Parent": {
  "type": "object",
  "additionalProperties": {
    "$ref": "#/components/schemas/Child"
  },
  "description": "A map of `Child` schemas, where the keys are IDs that correspond to the child",
  "example": {
    "child1": { ... bunch of stuff ... },
    "child2": { ... bunch of stuff ... },
  }

如果可能的键名称已知(例如,它们是枚举的一部分),您可以将字典定义为常规对象,并将键定义为单独的对象属性:

// Keys can be: key1, key2, key3

"Parent": {
   "type": "object",
   "properties": { 
      "key1": { "$ref": "#/components/schemas/Child" },
      "key2": { "$ref": "#/components/schemas/Child" },
      "key3": { "$ref": "#/components/schemas/Child" }
   }
}

然后你可以添加"additionalProperties": false真正确保只使用这些密钥。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在“map”对象中编写 OpenAPI 3 (Swagger) 规范的属性名称? 的相关文章

随机推荐

  • 解释 ExtJS 4 事件处理

    我最近开始学习 ExtJS 并且很难理解如何处理事件 我没有任何以前版本的 ExtJS 的经验 通过阅读各种手册 指南和文档页面 我已经弄清楚了如何使用它 但我不清楚它是如何工作的 我找到了几个针对旧版本 ExtJS 的教程 但我不确定它们
  • Pygame 快速像素读取

    好吧 希望有人能帮助我 因为我在这里不知所措 我正在用 python 开发一款游戏 它使用相机作为主控制器 要玩游戏 您只需移动一个简单的灯光即可控制游戏 到目前为止 我已经成功地将相机图像获取到表面 并将其显示在屏幕上 但当涉及到寻找光时
  • 如何知道文本文件中流读取器的位置(行号)?

    一个例子 这可能不是现实生活 但为了阐明我的观点 public void StreamInfo StreamReader p string info string Format The supplied streamreaer read 0
  • 如何根据 WPF DataGrid 中的更改更新 ObservableCollection 项的属性?

    我有一个 WPF DataGrid 其数据源是 ObservableCollection 它的松散设置如下 public class ItemDataCollection ObservableCollection
  • 无法创建调试桥:无法启动adb服务器:无法检测adb版本

    我目前在打开项目时遇到这个问题 事件日志中显示的错误 无法检测 adb 版本 退出值 0xc0000409 adb 输出 adb exe F 11 11 09 55 06 17768 944 fdevent poll cpp 64 无法创建
  • 在 Ubuntu 上启动 Apache2 失败

    我使用 Ubuntu 和 MYSQL 安装指南进行 OSQA 遵循起来非常简单 直到我到达最后一步 即启动 Apache2 服务器 我仔细检查了一下是否错过了前面的任何步骤 而我确实错过了一个 这是 sudo ln s etc apache
  • 构成最大总和的数字

    我刚刚编写了我的程序 它从数组中找到最大和 但我陷入困境 有什么方法可以找到哪些数字对最大总和做出了贡献 给出最大总和规则 相邻元素不应贡献 合计 我对数组中最大总和的解决方案 public class MaximumELementInAR
  • Java - 设置类路径

    我的示例应用程序告诉我 No qtjambi deployment xml found in classpath loading libraries via java library path 我希望我的应用程序使用qtjambi depl
  • 从 PowerShell 运行 cmd /c,文件路径中包含空格

    我正在尝试在 PowerShell 中运行以下命令 PS C Users Administrator gt cmd c C Program Files x86 Microsoft Visual Studio 2017 BuildTools
  • 为什么我会看到“Nodetool 状态连接被拒绝”?

    我已经通过运行 Ubuntu 16 的 EC2 实例上的服务安装了 Cassandra 但我一生都无法理解为什么我无法使 nodetool 状态正常工作 我听说我应该更改 cassanda env sh 以包含主机名 我已经在这里完成了 a
  • 在 MATLAB 中使用 Levenberg-Marquardt (lsqcurvefit) 获取协方差矩阵

    我正在使用 Matlab 中的 lsqcurvefit 函数对一些实验数据进行建模 数据采用特定的形状 因此算法只是调整该形状的系数来改变其幅度等 该模型运行良好并且拟合良好 我已经计算了卡方 Levenberg Marquardt 算法的
  • 为什么要使用开始活动?

    我一直在浏览 API 文档 并注意到从 API 级别 16 开始Context http developer android com reference android content Context html类包含以下方法 public
  • 使用房间时“无法合并 dex”

    我正在尝试向我的项目添加一个 房间 当我尝试构建项目时 出现错误 错误 任务 app transformDexArchiveWithExternalLibsDexMergerForDebug 执行失败 java lang RuntimeEx
  • 将 IDataErrorInfo 与嵌套对象结合使用

    我正在使用 MVVM 我想使用 IDataErrorInfo 来验证我的视图 我当前的实现包括嵌套对象和不同的 ViewModel 例如业务实体 客户 包含业务实体 地址 我在我的视图中直接访问地址 例如 Customer Address
  • 如何使 Protobuf 3 字段成为必填字段?

    我正在使用 GRPC proto buffers 在 GoLang 中编写我的第一个 API 端点 我对 Go 还很陌生 以下是我为测试用例编写的文件 package my package import context testing gi
  • 未找到 Mysqli 类。使用percona、php5-fpm、nginx、phalcon

    Fatal error Class TKStdlib mysqli not found in var www tk browser app application library tk stdlib DbAbstract php on li
  • 如何在rails中自定义bulma变量

    我正在使用 bulmarails gem 我想自定义它使用的一些变量 特别是字体颜色 根据布尔玛文档http bulma io documentation overview customize http bulma io documenta
  • Kubernetes 服务到底是什么以及它们与部署有何不同

    在阅读了这样的 Kubernetes 文档后 部署 https kubernetes io docs concepts workloads controllers deployment service https kubernetes io
  • 检查渲染方法

    我正在使用react redux 和react redux router 当我运行应用程序时 出现错误 我不明白它与我的 App js 中的 React 渲染函数有什么关系 在我看来 问题出在代码的其他地方 错误如下 Warning Rea
  • 如何在“map”对象中编写 OpenAPI 3 (Swagger) 规范的属性名称?

    我试图描述的 API 具有一个结构 其中根对象可以包含任意数量的子对象 属性本身就是对象 根对象中的 键 或属性是子对象的唯一标识符 值是子对象的其余数据 child1 bunch of stuff child2 bunch of stuf