将JSON转换为与Swagger 2.0兼容的JSON模式草案4

将JSON转换为与Swagger 2.0兼容的JSON模式草案4,json,swagger,jsonschema,swagger-2.0,Json,Swagger,Jsonschema,Swagger 2.0,我收到了一些由RESTAPI生成的JSON文件,其中包含大量属性 我已经为这个API创建了一个Swagger 2.0定义,需要为它提供相应的响应模式 主要问题是:这个JSON文件有很多属性。如果我手动编写模式,这将花费很多时间,并且会犯很多错误。它不是我需要描述的唯一API 我知道有一些工具可以将JSON转换为JSON模式,但如果我没有弄错的话,Swagger只有$refs到其他对象定义,因此只有一个级别,而我发现的工具只生成树结构模式。 我的问题是:有没有工具可以将JSON(或JSON模式)转

我收到了一些由RESTAPI生成的JSON文件,其中包含大量属性

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

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

我知道有一些工具可以将JSON转换为JSON模式,但如果我没有弄错的话,Swagger只有$refs到其他对象定义,因此只有一个级别,而我发现的工具只生成树结构模式。 我的问题是:有没有工具可以将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
      }
    ]
  }
  ]
但是,什么给了我:

---
"$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
我不熟悉这一点,但很好奇,请毫不犹豫地深入解释

提前感谢您的帮助

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

你错了。Swagger将尊重任何有效的v4 JSON模式,只要它只使用

模式对象…基于JSON模式规范草案4和 使用它的预定义子集。在此子集之上,本规范提供了一些扩展,以允许更完整的 文件


它接着列出了JSON模式中支持的部分,不支持的部分,以及通过swagger扩展的部分。

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

鉴于此JSON(他们的示例):

它产生了以下结果:

{
    "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"
            }
        }
    }
}
您可以直接转到联机转换。 我编写了以下python脚本,以生成在Swagger中使用的YAML格式(保留键顺序)的JSON模式。 更新:如果希望YAML具有排序键(默认情况下),请使用YAML库
嗨,汤姆&谢谢你的回答。我可以看到,在定义标记处只有一个级别。当需要使用其他类型时,它们会为其他类型创建$ref:“#/definitions/Activity”。但在JSON模式v4中,它不是强制性的。有什么解决方案吗?@tom redgen是否有任何java库可以将Json模式转换为Json对象……我假设您打算使用
indent
而不是
intent
。根据我的经验,最好使用整数作为缩进级别,并在最晚可能的时刻执行
'*indent
(即两个空格的字符串)。这样,如果你想要四个空格的缩进,只有一个地方可以改变。(如果要使用YAML库,首先就不必跟踪缩进级别)。为什么导入
pprint
?考虑使用<代码> iStase(VAR,DICT)< /C> >而不是<代码>类型(var)是DICT< /Cord>。@欧通谢谢您的建议。我已经将更新放在YAML库用于从JSON转换为YAML的地方,但不会保留键顺序。如果要维护密钥顺序是很重要的,请考虑实现手动缩进的第一个代码块。如果需要保存密钥顺序,请使用RuMel.YAML。(我是那个包的作者):而不是<代码>导入YAML > do>代码>导入RuMel.yAML。代替
d={}
do
d=ruamel.yaml.comments.CommentedMap()
并将
dump(…)
行更改为两行:
yaml=ruamel.yaml.yaml()
yaml.dump(p,outfile)
。这应该保持有序和块的风格。如果你不能让它发挥作用,在这里发布一个问题并贴上标签,那么我会看到它的链接正是我所寻找的!之后,几乎有2000行的招摇过市代码。但愿我能早点找到它:(但非常感谢!@bikram有没有可以将Json模式转换为Json对象的java库…Mateuscb有没有可以将Json模式转换为Json对象的java库…@VishwaPratap我不确定。我还没想到这个问题。
{
    "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)