web-dev-qa-db-fra.com

Convertir JSON en JSON Schema draft 4 compatible avec Swagger 2.0

J'ai reçu des fichiers JSON générés par une API REST avec de nombreuses propriétés.

J'ai créé une définition Swagger 2.0 pour cette API et je dois lui donner le schéma correspondant pour la réponse.

Le principal problème: ce fichier JSON a beaucoup de propriétés. Cela prendrait tellement de temps et je ferais beaucoup d'erreurs si j'écrivais le schéma manuellement. Et ce n'est pas la seule API que je dois décrire.

Je sais qu'il existe des outils pour convertir des schémas JSON en JSON mais, si je ne me trompe pas, Swagger n'a que $ refs pour d'autres définitions d'objets donc n'a qu'un seul niveau alors que les outils que j'ai trouvés ne produisent que des schémas arborescents. Ma question: existe-t-il un outil pour convertir un JSON (ou un schéma JSON) en un Swagger 2.0 compatible?

Remarque: je travaille dans YAML mais je ne serais pas un problème, n'est-ce pas?

Par exemple, ce dont j'ai besoin:

  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

Pour mon 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
      }
    ]
  }
  ]

Mais, ce que http://jsonschema.net/#/ me donne:

---
"$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

Je suis nouveau à cela, mais curieux, n'hésitez pas à expliquer en profondeur.

Merci d'avance pour votre aide !

13
Cwellan

Je sais qu'il existe des outils pour convertir les schémas JSON en JSON mais, si je ne me trompe pas, Swagger n'a que $ refs pour d'autres définitions d'objets donc n'a qu'un seul niveau

Tu te trompes. Swagger respectera tout schéma JSON v4 valide, tant qu'il n'utilisera que le sous-ensemble pris en charge .

L'objet de schéma ... est basé sur le projet de spécification de schéma JSON 4 et en utilise un sous-ensemble prédéfini . En plus de ce sous-ensemble, il existe des extensions fournies par cette spécification pour permettre une documentation plus complète.

Il énumère ensuite les parties du schéma JSON qui sont prises en charge, les bits qui ne le sont pas et les bits qui sont étendus par swagger.

4
tom redfern

J'avais également besoin d'un outil de conversion et je suis tombé dessus. Jusqu'à présent, cela semble assez bien fonctionner. Il prend en charge les formats JSON et YAML.

https://swagger-toolbox.firebaseapp.com/

Compte tenu de ce JSON (leur échantillon):

{
  "id": 1,
  "name": "A green door",
  "price": 12,
  "testBool": false,
  "tags": [
    "home",
    "green"
  ]
}

il a généré ceci:

{
    "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"
            }
        }
    }
}
29
mateuscb

Vous pouvez directement goto https://bikcrum.github.io/Swagger-JSON-Schema-In-YAML_webversion/ pour la conversion en ligne.

J'ai écrit le script python pour générer le schéma JSON au format YAML (en préservant l'ordre des clés) utilisé dans Swagger.

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,'')

Mise à jour: si vous voulez YAML avec des clés triées (ce qui est par défaut) utilisez la bibliothèque 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)
4
Bikram