【问题标题】:How can I describe complex json model in swagger如何在招摇中描述复杂的 json 模型
【发布时间】:2014-11-30 03:35:01
【问题描述】:

我正在尝试使用 Swagger 来描述我正在构建的 web-api。 问题是我看不懂如何描述复杂的json对象?

例如,如何描述这个对象:

{
  name: "Jhon",
  address: [
    {
      type: "home",
      line1: "1st street"
    },
    {
       type: "office",
       line1: "2nd street"
    }
  ]
}

【问题讨论】:

  • 答案在 Swagger 1.2 和 Swagger 2.0 之间是不同的。你打算用哪一个?
  • Swagger 2.0。谢谢
  • 您是在寻找与 Swagger-editor 一起使用的 JSON 表示还是 YAML 表示?获得这些信息后,我可以为您提供相关的 sn-p。
  • 如果可能的话我更喜欢json,谢谢。
  • 嗨@Ron!如何在任何数组中设置对象长度,例如地址中应该至少有 3 个地址,最大数量可以是任何人。谢谢。

标签: swagger swagger-ui


【解决方案1】:

好的,所以根据上面的 cmets,您需要以下架构:

{
  "definitions": {
    "user": {
      "type": "object",
      "required": [ "name" ],
      "properties": {
        "name": {
          "type": "string"
        },
        "address": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/address"
          }
        }
      }
    },
    "address": {
        "type": "object",
        "properties": {
            "type": {
                "type": "string",
                "enum": [ "home", "office" ]
            },
            "line1": {
                "type": "string"
            }
        }
    }
  }
}

我做了一些假设,以使示例更复杂一些,以在将来提供帮助。 对于“用户”对象,我已经声明“名称”字段是强制性的。例如,如果您还需要地址是强制性的,您可以将定义更改为“必需”:[“名称”,“地址”]。

我们基本上使用 json-schema 的一个子集来描述模型。当然不是每个人都知道它,但它很容易学习和使用。

对于您可以看到的地址类型,我还将限制设置为两个选项 - 家庭或办公室。您可以向该列表中添加任何内容,或完全删除“枚举”以删除该约束。

当一个属性的“类型”是“数组”时,你需要在它旁边加上声明数组内部类型的“项目”。在这种情况下,我引用了另一个定义,但该定义也可能是内联的。这种方式通常更容易维护,尤其是当您需要单独或在其他模型中定义“地址”时。

根据要求,内联版本:

{
  "definitions": {
    "user": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "address": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "home",
                  "office"
                ]
              },
              "line1": {
                "type": "string"
              }
            }
          }
        }
      }
    }
  }
}

【讨论】:

  • 感谢您的详细解答。如果你能善意地给她一个内联的例子,那就太好了。另一个问题是 SwaggerUI 是否支持这种复杂的对象模式?因为我测试它没有。
  • 我已经用内联版本修改了答案。
  • Swagger-UI 应该支持复杂的模式。我需要看一个完整的例子来理解可能有什么问题。您也可以使用我们的 google 小组来解答此类问题。
  • @Ron 我知道这已经晚了。但是你能解释一下这个模型吗?或者冉可以。我是新手。 Swagger 将如何改变其 UI 以支持这种结构
  • @nilan59 - 我建议在groups.google.com/forum/#!forum/swagger-swaggersocket 中发布您的问题,我们会在那里提供帮助。 cmets 并不适合。
猜你喜欢
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 2015-08-15
相关资源
最近更新 更多