json - OpenAPI:接受任何(复杂)JSON值的模式

标签 json api swagger-2.0 openapi

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

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

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

所以我正在尝试通过定义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.0'
definitions:
  AnyValue: {}

# openapi: 3.0.0
components:
  schemas:
    AnyValue: {}

或者,如果您需要description:

# swagger: '2.0'
definitions:
  AnyValue:
    description: 'Can be anything: string, number, array, object, etc. (except `null`)'

# openapi: 3.0.0
components:
  schemas:
    AnyValue:
      description: 'Can be anything: string, number, array, object, etc., including `null`'

如果没有定义的type,则架构将允许任何值。请注意,OpenAPI 2.0规范不支持null值,但是某些工具可能仍支持null。

在OpenAPI 3.0中,除非其他约束(例如type)明确禁止使用null,否则null -less模式将允许enum值。

有关无type模式的工作方式的更多详细信息,请参见this Q&A

这是Swagger Editor 2.0如何使用AnyValue模式处理主体参数的方法:

我不知道代码生成器是如何处理的。

关于json - OpenAPI:接受任何(复杂)JSON值的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32841298/

相关文章:

javascript - 如何从Json结果中获取值

swagger - @ApiResponse 注解在 Swagger 中的可重用性

spring - 可分页未在 swagger 中正确显示

javascript - 如何从嵌套 JSON 响应 Angular.js 列出项目(渲染)

json - ionic : I have a scope variable empty from a stringified json

mysql - 如何使用 MySQL 查询 JSON 对象内未修改的时间戳?

facebook graph api - 搜索事件

swift - 将来自 API 的解码数据用于算法

api - Facebook Connect 在个人 API 上进行身份验证

java - 在我的 Spring Boot 应用程序中 Swagger