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 !
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.
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"
}
}
}
}
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)