当前位置: 首页 > 知识库问答 >
问题:

将 JSON 转换为与 Swagger 2.0 兼容的 JSON 架构草案 4

姜献
2023-03-14

我得到了一些由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

我是新手,但很好奇,不要犹豫,深入解释。

提前感谢您的帮助!

共有3个答案

狄旻
2023-03-14
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)
马欣德
2023-03-14

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

你错了。Swagger 将遵循任何有效的 v4 JSON 架构,只要它只使用支持的子集即可。

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

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

盖嘉珍
2023-03-14

我还需要一个转换工具,并发现了这个。到目前为止,它似乎工作得很好。它支持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"
            }
        }
    }
}
 类似资料:
  • 我有一个如下的Json模式,当我在网上验证它时,比如http://jsonschemalint.com/draft4/#,它说它是有效的。我把“类型”改成了“对象”、“数组”、“字符串”,其余的结构保持不变。它仍然说是有效的模式。我的理解是当类型=对象时应该有“属性”,当类型=数组时应该有“项目”

  • 问题内容: 我正在尝试使用该包将Go结构转换为JSON,但我得到的只是。我敢肯定这是完全显而易见的,但我看不到。 然后,当我尝试运行它时,我得到以下信息: 问题答案: 您需要导出的字段,以便在包装可以看到它。将字段重命名为。 输出:

  • 问题内容: 但是,我仍然无法将csv文件转换为JSON的层次结构。我在stackoverflow上找到的脚本是特定于某个问题的。假设必须对三个变量进行分组: 这将导致这样的JSON文件(据我尝试): 这些必须分组为嵌套结构,例如: 我尝试了该站点上的每个脚本,但是无法创建可以使flare.json这样的通用函数。我可以发布代码,但这就像上面提供的链接一样。因此,我要求一个简单的代码(或可以帮助我的

  • 问题内容: 我在此上浪费了很多时间。递归部分非常虚幻。 对于未知深度的给定HTML结构,我需要转换为JSON。 (我从正在构建的某些YAML i18n翻译系统中使用此功能) 我的一般想法是深入了解,直到找到,然后使用的键/值创建一个对象,然后返回该对象,因此它将是最后到达的KEY的值。 (是的,开发有点复杂,但非常有趣) JSBIN游乐场 -实时代码示例 我无法让递归函数正常工作,无法输出所需的J

  • 问题内容: 我创建了一个,并希望将其另存为JSON文件。 …导致: 但是如何将对象转换为类似的东西: 问题答案: 您可以添加一个计算属性以获取JSON表示,并添加静态(类)函数以从 数组创建JSON 数组。 编辑: Swift 4引入了该协议,该协议提供了一种非常方便的方式来编码和解码自定义结构。

  • 我有一个具有如下架构的数据帧 我已经有了上面的结果。 我想使用火花scala转换如下架构 请帮忙