首页 文章

将JSON转换为与Swagger 2.0兼容的JSON Schema draft 4

提问于
浏览
11

我已经获得了REST API生成的一些JSON文件,这些文件具有大量属性 .

我为这个API创建了一个Swagger 2.0定义,需要为它提供相应的响应模式 .

主要问题:这个JSON文件有很多属性 . 这需要花费很多时间,如果我手动编写模式,我会犯很多错误 . 它不是我需要描述的唯一API .

我知道有一些工具可以将JSON转换为JSON模式但是,如果我没有弄错,Swagger只有$ refs到其他对象定义,因此只有一个级别,而我发现的工具只生成树结构模式 . 我的问题:是否有任何工具可以将JSON(或JSON Schema)转换为兼容Swagger 2.0的工具?

注意:我在YAML工作,但我不会成为问题,是吗?

例如,我需要的是:

List of Movements:
    type: "array"
    items:
      $ref: "#/definitions/Movement"
  Movement:
    properties:
      dateKey:
        type: "string"
      movement:
        $ref: "#/definitions/Stock"
    additionalProperties: false
  Stock:
    properties:
      stkUnitQty:
        type: "string"
      stkDateTime:
        type: "string"
      stkUnitType:
        type: "string"
      stkOpKey:
        type: "string"
    additionalProperties: false

对于我的JSON文档:

[
  {
    "dateKey": "20161110",
    "stkLvls": [
      {
        "stkOpKey": "0",
        "stkUnitType": "U",
        "stkDateTime": "20161110T235010.240+0100",
        "stkUnitQty": 30
      }
    ]
  },
  {
    "dateKey": "20161111",
    "stkLvls": [
      {
        "stkOpKey": "0",
        "stkUnitType": "U",
        "stkDateTime": "20161111T231245.087+0100",
        "stkUnitQty": 21
      }
    ]
  }
  ]

但是,http://jsonschema.net/#/给了我什么:

---
"$schema": http://json-schema.org/draft-04/schema#
type: array
items:
  type: object
  properties:
    dateKey:
      type: string
    stkLvls:
      type: array
      items:
        type: object
        properties:
          stkOpKey:
            type: string
          stkUnitType:
            type: string
          stkDateTime:
            type: string
          stkUnitQty:
            type: integer
        required:
        - stkOpKey
        - stkUnitType
        - stkDateTime
        - stkUnitQty
  required:
  - dateKey
  - stkLvls

我是新手,但好奇,不要犹豫,深刻解释 .

预先感谢您的帮助 !

3 回答

  • 18

    我知道有一些工具可以将JSON转换为JSON模式但是,如果我没有弄错的话,Swagger只有$ refs到其他对象定义,因此只有一个级别

    你误会了 . Swagger将尊重任何有效的v4 JSON模式,只要它只使用supported subset即可 .

    Schema Object ...基于JSON Schema Specification Draft 4并使用它的预定义子集 . 除此子集外,此规范还提供了扩展,以便提供更完整的文档 .

    它继续列出支持的JSON模式的部分,以及不是的比特,以及由swagger扩展的比特 .

  • 3

    我还需要一个转换器工具,并遇到了这个问题 . 到目前为止它似乎工作得很好 . 它同时执行JSON和YAML格式 .

    https://swagger-toolbox.firebaseapp.com/

    鉴于此JSON(他们的样本):

    {
      "id": 1,
      "name": "A green door",
      "price": 12,
      "testBool": false,
      "tags": [
        "home",
        "green"
      ]
    }
    

    它生成了这个:

    {
        "required": [
            "id",
            "name",
            "price",
            "testBool",
            "tags"
        ],
        "properties": {
            "id": {
                "type": "number"
            },
            "name": {
                "type": "string"
            },
            "price": {
                "type": "number"
            },
            "testBool": {
                "type": "boolean"
            },
            "tags": {
                "type": "array",
                "items": {
                    "type": "string"
                }
            }
        }
    }
    
  • 1

    您可以直接转到https://bikcrum.github.io/Swagger-JSON-Schema-In-YAML_webversion/进行在线转换 .

    我编写了以下python脚本,以生成在Swagger中使用的YAML格式(保留键顺序)的JSON模式 .

    import json
    
    # input file containing json file
    with open('data.json') as f:
        json_data = json.load(f)
    
    # json schema in yaml format
    out = open('out.yaml','w')
    
    def gettype(type):
        for i in ['string','boolean','integer']:
            if type in i:
                return i
        return type
    
    def write(string):
        print(string)
        out.write(string+'\n')
        out.flush()
    
    def parser(json_data,indent):
        if type(json_data) is dict:
            write(indent + 'type: object')
            if len(json_data) > 0:
                write(indent + 'properties:')
            for key in json_data:
                write(indent + '  %s:' % key)
                parser(json_data[key], indent+'    ')
        elif type(json_data) is list:
            write(indent + 'type: array')
            write(indent + 'items:')
            if len(json_data) != 0:
                parser(json_data[0], indent+'  ')
            else:
                write(indent + '  type: object')
        else:
            write(indent + 'type: %s' % gettype(type(json_data).__name__))
    
    parser(json_data,'')
    

    更新:如果您希望YAML具有排序键(默认情况下),请使用YAML库

    import json
    import yaml
    
    # input file containing json file
    with open('data.json') as f:
        json_data = json.load(f)
    
    # json schema in yaml format
    
    def gettype(type):
        for i in ['string','boolean','integer']:
            if type in i:
                return i
        return type   
    
    def parser(json_data):
        d = {}
        if type(json_data) is dict:
            d['type'] = 'object'
            for key in json_data:
                d[key] = parser(json_data[key])
            return d
        elif type(json_data) is list:
            d['type'] = 'array'
            if len(json_data) != 0:
                d['items'] = parser(json_data[0])
            else:
                d['items'] = 'object'
            return d
        else:
            d['type'] = gettype(type(json_data).__name__)
            return d
    
    p = parser(json_data)
    with open('out.yaml','w') as outfile:
        yaml.dump(p,outfile, default_flow_style=False)
    

相关问题