代码之家  ›  专栏  ›  技术社区  ›  xehpuk

如何描述字典的键?[复制品]

  •  0
  • xehpuk  · 技术社区  · 6 年前

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

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

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

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

    但这两种方法都使得在结构上不太清楚标识属性是什么,并且使得子id之间的唯一性是隐式的而不是显式的,所以我们希望使用对象或映射。

    我看到了 Model with Map/Dictionary Properties ,但这并不完全适合我的用例。写一些像:

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

    产生这样的结果:

    Swagger rendering of API

    这充分地传达了属性中值的描述性,但是如何记录对象中“键”的限制?理想情况下,我想说“这不仅仅是任意字符串,而是对应于子字符串的i d”。这有什么支持吗?

    0 回复  |  直到 7 年前
        1
  •  2
  •   Helen    6 年前

    你的例子是正确的。

    如何记录对象中“密钥”的限制?理想情况下,我想说“这不仅仅是任意字符串,而是对应于子字符串的i d”。这有什么支持吗?

    openapi假设键是字符串,但是目前(从openapi 3.0开始)没有办法限制键的内容/格式。您可以在模式中口头记录任何限制和细节 description . 添加模式示例可以帮助说明字典/映射的外观。

    "Parent": {
      "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 ... },
      }
    

    有个建议要补充 support for patternProperties 在模式中,这将允许定义密钥格式。但从openapi 3.0.2开始,它仍处于提议阶段。


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

    // Keys can be: key1, key2, key3
    
    "Parent": {
      "key1": { "$ref": "#/components/schemas/Child" },
      "key2": { "$ref": "#/components/schemas/Child" },
      "key3": { "$ref": "#/components/schemas/Child" }
    }