web-dev-qa-db-ja.com

JSONをSwagger 2.0と互換性のあるJSONスキーマドラフト4に変換する

REST APIで多くのプロパティを生成したJSONファイルをいくつか与えられました。

このAPIのSwagger 2.0定義を作成しましたが、応答に対応するスキーマを指定する必要があります。

主な問題:このJSONファイルには多くのプロパティがあります。時間がかかり、スキーマを手動で作成すると、多くの間違いを犯します。そして、説明する必要があるAPIだけではありません。

JSONをJSONスキーマに変換するツールはいくつかありますが、間違えなければ、Swaggerには他のオブジェクト定義への$ refしかありません。したがって、私が見つけたツールはツリー構造スキーマのみを生成します。私の質問:JSON(またはJSONスキーマ)を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

私はそれは初めてですが、好奇心が強く、深く説明することをheしないでください。

よろしくお願いします!

13
Cwellan

JSONをJSONスキーマに変換するツールはいくつかありますが、間違えなければ、Swaggerには他のオブジェクト定義への$ refしかなく、したがって1レベルしかありません

あなたは間違っています。 Swaggerは、 サポートされるサブセット のみを使用する限り、有効なv4 JSONスキーマをすべて尊重します。

スキーマオブジェクト...はJSONスキーマ仕様ドラフト4に基づいており、の定義済みサブセットを使用します。このサブセットの上に、より詳細なドキュメントを作成できるように、この仕様で提供される拡張機能があります。

さらに、サポートされているJSONスキーマの部分、サポートされていない部分、およびswaggerによって拡張されている部分をリストします。

4
tom redfern

変換ツールも必要で、これに出くわしました。これまでのところ、かなりうまくいくようです。 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"
            }
        }
    }
}
29
mateuscb

https://bikcrum.github.io/Swagger-JSON-Schema-In-YAML_webversion/ に直接移動して、オンライン変換を行うことができます。

Swaggerで使用されるYAML形式(キーの順序を保持)でJSONスキーマを生成するpythonスクリプトを記述しました。

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)
4
Bikram