将 JSON 转换为与 Swagger 2.0 兼容的 JSON Schema 草案 4
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/40908214/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Convert JSON to JSON Schema draft 4 compatible with Swagger 2.0
提问by Cwellan
I've been given some JSON files generated by a REST API with plenty of properties.
我得到了一些由具有大量属性的 REST API 生成的 JSON 文件。
I've created a Swagger 2.0 definition for this API and need to give it the corresponding schema for the response.
我已经为此 API 创建了 Swagger 2.0 定义,并且需要为其提供相应的响应架构。
The main problem: this JSON file has loads of properties. It would take so much time and I would make many mistakes if I write the schema manually. And it's not the only API I need to describe.
主要问题:这个 JSON 文件有很多属性。如果我手动编写模式,会花费很多时间,而且我会犯很多错误。这不是我需要描述的唯一 API。
I know there are some tools to convert JSON to JSON schemas but, if I'm not mistaken, Swagger only has $refs to other objects definitions thus only has one level whereas the tools I've found only produce tree structured schemas. My question: is there any tool to convert a JSON (or JSON Schema) to a Swagger 2.0 compatible one ?
我知道有一些工具可以将 JSON 转换为 JSON 模式,但是,如果我没记错的话,Swagger 只有对其他对象定义的 $refs 因此只有一个级别,而我发现的工具只生成树结构模式。我的问题:是否有任何工具可以将 JSON(或 JSON 架构)转换为 Swagger 2.0 兼容的一个?
Note: I'm working in YAML but I wouldn't be an issue, would it ?
注意:我在 YAML 中工作,但我不会成为问题,是吗?
For example, what I need:
例如,我需要什么:
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
For my JSON document:
对于我的 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
}
]
}
]
But, what http://jsonschema.net/#/gives me:
但是,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
I'm new to that, but curious, don't hesitate to explain deeply.
我对此很陌生,但很好奇,请不要犹豫,深入解释一下。
Thank you in advance for your help !
预先感谢您的帮助 !
采纳答案by tom redfern
I know there are some tools to convert JSON to JSON schemas but, if I'm not mistaken, Swagger only has $refs to other objects definitions thus only has one level
我知道有一些工具可以将 JSON 转换为 JSON 模式,但是,如果我没记错的话,Swagger 只有对其他对象定义的 $refs 因此只有一个级别
You are mistaken. Swagger will respect any valid v4 JSON schema, as long as it only uses the supported subset.
你误会了。Swagger 将尊重任何有效的 v4 JSON 模式,只要它只使用支持的子集。
The Schema Object...is based on the JSON Schema Specification Draft 4 and uses a predefined subset of it. On top of this subset, there are extensions provided by this specification to allow for more complete documentation.
架构对象...基于 JSON 架构规范草案 4 并 使用它的预定义子集。在这个子集之上,本规范提供了扩展以允许更完整的文档。
It goes on to list the parts of JSON schema which are supported, and the bits which are not, and the bits which are extended by swagger.
它继续列出支持的 JSON 模式部分,不支持的位,以及由 swagger 扩展的位。
回答by mateuscb
I also needed a converter tool and came across this. So far it seems to work pretty well. It does both JSON and YAML formats.
我还需要一个转换器工具并遇到了这个问题。到目前为止,它似乎工作得很好。它支持 JSON 和 YAML 格式。
https://swagger-toolbox.firebaseapp.com/
https://swagger-toolbox.firebaseapp.com/
Given this JSON (their sample):
鉴于此 JSON(他们的示例):
{
"id": 1,
"name": "A green door",
"price": 12,
"testBool": false,
"tags": [
"home",
"green"
]
}
it generated this:
它产生了这个:
{
"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"
}
}
}
}
回答by bikram
You can directly goto https://bikcrum.github.io/Swagger-JSON-Schema-In-YAML_webversion/for online conversion.
您可以直接转到https://bikcrum.github.io/Swagger-JSON-Schema-In-YAML_webversion/进行在线转换。
I wrote following python script to generate JSON schema in YAML format (preserving key order) that is used in Swagger.
我编写了以下 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,'')
Update: If you want YAML with sorted keys (which is by default) use YAML library
更新:如果您想要带有排序键的 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)

