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しないでください。
よろしくお願いします!
JSONをJSONスキーマに変換するツールはいくつかありますが、間違えなければ、Swaggerには他のオブジェクト定義への$ refしかなく、したがって1レベルしかありません
あなたは間違っています。 Swaggerは、 サポートされるサブセット のみを使用する限り、有効なv4 JSONスキーマをすべて尊重します。
スキーマオブジェクト...はJSONスキーマ仕様ドラフト4に基づいており、の定義済みサブセットを使用します。このサブセットの上に、より詳細なドキュメントを作成できるように、この仕様で提供される拡張機能があります。
さらに、サポートされているJSONスキーマの部分、サポートされていない部分、およびswaggerによって拡張されている部分をリストします。
変換ツールも必要で、これに出くわしました。これまでのところ、かなりうまくいくようです。 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"
}
}
}
}
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,'')
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)