首页 文章

Swagger 2.0:接受任何(复杂)JSON值的模式

提问于
浏览
3

我正在编写Swagger 2.0规范的API基本上是任何JSON值的存储 .

我想要一个读取值的路径和一个存储非预定义深度的任何JSON值(null,数字,整数,字符串,对象,数组)的路径 .

不幸的是,似乎Swagger 2.0对输入和输出的模式非常严格,并且不允许JSON Schema允许的整套模式 . Swagger编辑器不允许使用示例混合值(例如,可以是布尔值或整数的属性)或松散定义的数组(必须严格定义项的类型)和对象 .

所以我正在通过定义 MixedValue 架构来尝试解决方法:

---
swagger: '2.0'
info:
  version: 0.0.1
  title: Data store API
consumes:
- application/json
produces:
- application/json
paths:
  /attributes/{attrId}/value:
    parameters:
    - name: attrId
      in: path
      type: string
      required: true
    get:
      responses:
        '200':
          description: Successful.
          schema:
            $ref: '#/definitions/MixedValue'
    put:
      parameters:
      - name: value
        in: body
        required: true
        schema:
          $ref: '#/definitions/MixedValue'
      responses:
      responses:
        '201':
          description: Successful.
definitions:
  MixedValue:
    type: object
    properties:
      type:
        type: string
        enum:
        - 'null'
        - boolean
        - number
        - integer
        - string
        - object
        - array
      boolean:
        type: boolean
      number:
        type: number
      integer:
        type: integer
      string:
        type: string
      object:
        description: deep JSON object
        type: object
        additionalProperties: true
      array:
        description: deep JSON array
        type: array
    required:
    - type

但Swagger编辑器拒绝松散定义的 objectarray 属性 .

问题: - 有没有办法解决这个问题? - 它只是一个Swagger编辑器错误还是Swagger 2.0规范的强大限制? - 是否有更好的方法(最佳实践)来指定我需要的东西? - 对于某些使用我的API规范的语言,我可以期待swagger生成的代码有一些限制吗?

2 回答

  • 15

    可以像这样定义任意类型的模式:

    definitions:
      AnyValue: {}
    

    或者如果你想要 description

    definitions:
      AnyValue:
        description: 'Can be anything: string, number, array, object, etc.'
    

    如果没有定义 typeAnyValue 可以是任何东西 - 字符串,数字,布尔值,数组,对象等 . 有关 type -less架构如何工作的更多详细信息,请参阅this Q&A .

    在OpenAPI 3.0中,您可以添加 nullable: true 以允许 null 值:

    components:
      schemas:
        AnyValue:
          nullable: true
          description: Can be anything, including null.
    

    以下是Swagger Editor 2.0如何使用 AnyValue 模式处理body参数:

    SwaggerEditor: Testing a PUT request with an arbitrary-type body

    我不知道代码生成器如何处理这个问题 .

  • 0

    也许这就是你正在寻找的“图案化物体”:

    场模式:^ x-

    类型:任何

    描述:允许扩展Swagger架构 . 字段名称必须以x-开头,例如x-internal-id . 值可以是null,基元,数组或对象 . 有关更多详细信息,请参阅供应商扩展 .

    资料来源:https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md

相关问题