我已经获得了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
我是新手,但好奇,不要犹豫深刻解释。
提前感谢您的帮助!
答案 0 :(得分:27)
我还需要一个转换工具并遇到过这种情况。到目前为止它似乎工作得很好。它同时执行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 :(得分:3)
我知道有一些工具可以将JSON转换为JSON模式但是,如果 我没弄错,Swagger只有$ refs到其他对象的定义 因此只有一个级别
你错了。 Swagger将尊重任何有效的v4 JSON模式,只要它只使用supported subset即可。
Schema Object ...基于JSON Schema Specification Draft 4和 使用预定义的子集。在此子集的顶部,此规范提供了扩展以允许更完整 文档。
它继续列出支持的JSON模式的部分,以及不是的比特,以及由swagger扩展的比特。
答案 2 :(得分:3)
All changes in this pull request
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,'')