Outil pour générer un schéma JSON à partir de données JSON [fermé]

178

Nous avons ce brouillon de schéma json . Je voudrais obtenir un échantillon de mes données JSON et générer un squelette pour le schéma JSON, que je peux retravailler manuellement, en ajoutant des éléments tels que la description, requis, etc., qui ne peuvent pas être déduits des exemples spécifiques.

Par exemple, d'après mon entrée example.json:

{
    "foo": "lorem", 
    "bar": "ipsum"
}

Je lancerais mon outil json_schema_generator et obtiendrais:

{ "foo": {
    "type" : "string",
    "required" : true,
    "description" : "unknown"
  },
  "bar": {
    "type" : "string",
    "required" : true,
    "description" : "unknown"
  }
}

Cet exemple a été codé manuellement, il comporte donc peut-être des erreurs. Existe-t-il un outil qui pourrait m'aider avec la conversion JSON -> schéma JSON?

blueFast
la source
Mais comment l'outil saurait-il qu'il ne s'agit pas d'une carte générique des chaînes aux chaînes?
hmakholm a quitté Monica le
1
Dans l'exemple fourni, je dirais qu'il est clair que nous avons un dictionnaire (terminologie python), avec des paires clé-valeur, où les valeurs se trouvent être des chaînes. Je ne connais aucun autre schéma JSON qui décrirait les mêmes données. Et ce n'est qu'un exemple simple: cela pourrait devenir beaucoup plus compliqué, bien sûr, comme spécifié dans le brouillon du schéma JSON.
blueFast
3
Vous prétendez donc que "mapper des chaînes arbitraires à d'autres chaînes arbitraires" (comme un mappage des noms de fichiers aux descriptions du contenu) ne peut pas être exprimé comme un schéma JSON? Pour autant que je sache, c'est peut-être vrai, mais cela rendrait ce genre de schémas plutôt inutile à mon avis.
hmakholm a quitté Monica le
1
Mmmm, je ne suis pas sûr que nous discutons de quelque chose de pertinent à la question, mais quoi qu'il en soit. Prenons un meilleur exemple: avoir des clés fixes dans les données JSON est certainement utile si ces données JSON décrivent, par exemple, les propriétés d'une personne. Au lieu de "foo" et "bar", pensez au "nom" et au "nom de famille". "nom" et "nom de famille" sont des propriétés clairement fixées des données JSON de la personne, elles ne sont donc pas des chaînes arbitraires: elles font partie du schéma de la personne. Les valeurs sont bien sûr arbitraires, elles ne font donc pas partie du schéma.
blueFast
3
Avoir des clés fixes est parfois ce que vous voulez, et parfois non. C'est le point en fait: il n'y a aucun moyen qu'un outil automatisé puisse détecter à partir d'un seul échantillon les options que vous souhaitez.
hmakholm a quitté Monica le

Réponses:

92

Vous recherchez peut-être ceci:

http://www.jsonschema.net

C'est un outil en ligne qui peut générer automatiquement un schéma JSON à partir d'une chaîne JSON. Et vous pouvez facilement modifier le schéma.

Su vert
la source
3
Un point de départ facile et pratique. Mais notez les problèmes signalés avec jsonschema.net identifiés ailleurs sur cette page, et les raisons évoquées pour vouloir un outil hors ligne, ou au moins accessible par API, à inclure dans les flux de travail de développement, permettre la mise à jour des schémas avec un exemple ultérieur, etc. liste d'options par Steve Bennett.
nealmcb du
Veuillez noter que ce site générera des erreurs inattendues lors de la modification du schéma après l'importation initiale.
Coreus
1
Crashes pour quelque chose comme {"hello": "world","num": 42}mais semble prometteur-
DBX12
3
Les anciens sites n'étaient certainement pas assez bons. JSONSchema.Net a maintenant été réécrit. C'est beaucoup plus robuste. Si vous rencontrez des problèmes, veuillez les signaler sur GitHub et je serai ravi de
Jack
jsonschema2pojo.org est ce que j'utilise depuis des années
Someone Somewhere
83

Pour résumer les autres réponses, voici les générateurs de schéma JSON proposés jusqu'à présent:

En ligne:

Python:

NodeJS:

Rubis:

Steve Bennett
la source
jskemetor - nosetup.py
Att Righ
Avez-vous une chance de savoir si l'un de ces éléments prend en charge les entrées YAML? Nous pourrions convertir, mais juste une étape supplémentaire.
DylanYoung
28

GenSON ( PyPI | Github ) est un générateur de schéma JSON qui peut générer un schéma unique à partir de plusieurs objets. Vous pouvez également fusionner des schémas avec lui. Il est écrit en Python et est livré avec un outil CLI.

(Divulgation complète: je suis l'auteur.)

Wolverdude
la source
1
Beau travail, mec! Je regrette de ne pas avoir trouvé cela avant de commencer à travailler sur skinfer: github.com/scrapinghub/skinfer
Elias Dorneles
1
Pas un python, mais en voici un autre github.com/snowplow/schema-guru
chuwy
1
Génial! J'ai été déçu par le générateur de schémas en ligne jsonschema.net (il ne parvient pas à créer les propriétés «requises» pour la plupart des objets, n'a pas d'options pour produire des propriétés compactes (une ligne) ou omettre les ID, et surtout, génère un schéma qui ne parvient pas à valider les données utilisées pour le créer pour les tableaux à schéma unique). Au plaisir d'essayer votre outil.
Dave
@Dave - je suis aussi confronté à des problèmes similaires avec json schema.net, cet outil python a-t-il aidé?
Cshah
1
@Cshah: Je suis extrêmement impressionné par GenSON et j'ai contribué à un correctif. J'avais besoin de générer des schémas plus restrictifs que l'auteur n'était à l'aise, j'ai donc créé une version avec des options pour générer des propriétés de modèle et des propriétés supplémentaires / objets supplémentaires afin que les données JSON non reconnues soient signalées comme nécessitant une attention particulière.
Dave le
6

Après plusieurs mois, la meilleure réponse que j'ai est mon outil simple. C'est brut mais fonctionnel.

Ce que je veux, c'est quelque chose de similaire à ça . Les données JSON peuvent fournir un squelette pour le schéma JSON. Je ne l'ai pas encore implémenté, mais il devrait être possible de donner un schéma JSON existant comme base, afin que le schéma JSON existant plus les données JSON puissent générer un schéma JSON mis à jour. Si aucun schéma de ce type n'est donné en entrée, des valeurs par défaut sont prises.

Cela serait très utile dans le développement itératif: la première fois que l'outil est exécuté, le schéma JSON est factice, mais il peut être affiné automatiquement en fonction de l'évolution des données.

blueFast
la source
2
Curieux de savoir comment la suggestion de @Green Su n'a pas répondu à vos besoins. Je pense que vous décrivez un utilitaire qui fournit jumpstarter (votre terme est «squelettique») - quelque chose comme un générateur de code d'échafaudage?
justSteve
13
Fondamentalement, le problème avec cet outil est qu'il s'agit d'un outil en ligne . J'en ai besoin pour l'exécuter localement dans mon environnement de développement, parfois automatiquement dans le cadre d'autres tâches. Un outil "copier ici, coller là" ne m'aide pas. S'il avait une API REST, ce serait assez bon.
blueFast
2
@justSteve: l'outil en ligne, en plus d'utiliser un workflow copier-coller, apparaît toujours bogué (4 ans après la question d'origine). J'ai des objets json pour lesquels l'outil produit des schémas incorrects mais ne les ai pas encore réduits à des cas de test minimaux à soumettre en tant que rapports de bogue.
Dave
5

Il existe un outil python pour générer un schéma JSON pour un JSON donné: https://github.com/perenecabuto/json_schema_generator

Vinícius Mendes
la source
4
Ceci n'est pas maintenu depuis 2013. Il ne prend pas en charge Python 3. De plus, il ne prend en charge qu'un brouillon plus ancien, à savoir draft-03.
Acumenus
5

generate-schema( NPM | Github ) prend un objet JSON génère des schémas à partir de celui-ci, une sortie est JSON Schema, il est écrit en Node.js et est livré avec un outil REPL et ClI pour acheminer les fichiers vers.

Divulgation complète: je suis l'auteur :)

Nijikokun
la source
Avez-vous l'intention de mettre à jour le module vers le projet 4+? Ajouter min, max attrs, références et ainsi de suite? Merci pour l'outil btw :) Sera l'utiliser dans mon projet
Mr. Alien
5

Il existe un outil nodejs qui prend en charge le schéma json v4 à l' adresse https://github.com/krg7880/json-schema-generator

Cela fonctionne soit comme un outil de ligne de commande, soit comme une bibliothèque nodejs:

var jsonSchemaGenerator = require('json-schema-generator'),
    obj = { some: { object: true } },
    schemaObj;

schemaObj = jsonSchemaGenerator(json);
Johann Philipp Strathausen
la source
1
Livré avec une CLI aussi!
Peter Ilfrich
3

générateur de schéma json est un générateur de schéma JSON basé sur Ruby. Il prend en charge les brouillons 3 et 4 du schéma JSON. Il peut être exécuté en tant qu'exécutable autonome ou intégré à un script Ruby.

Ensuite, vous pouvez utiliser json-schema pour valider les exemples JSON par rapport à votre schéma nouvellement généré si vous le souhaitez.

HappyCoder86
la source
3

Pour les outils hors ligne qui prennent en charge plusieurs entrées, le meilleur que j'ai vu jusqu'à présent est https://github.com/wolverdude/GenSON/ Je voudrais voir un outil qui prend les noms de fichiers sur l'entrée standard car j'ai des milliers de fichiers . Cependant, je suis à court de descripteurs de fichiers ouverts, alors assurez-vous que les fichiers sont fermés . J'aimerais également voir des générateurs de schéma JSON qui gèrent la récursivité. Je travaille maintenant sur la génération de classes Java à partir d'objets JSON dans l'espoir d'aller au schéma JSON à partir de mes classes Java. Voici mon script GenSON si vous êtes curieux ou souhaitez y identifier des bugs.

#!/bin/sh
ulimit -n 4096
rm x3d*json
cat /dev/null > x3d.json
find ~/Downloads/www.web3d.org/x3d/content/examples -name '*json' -      print| xargs node goodJSON.js | xargs python bin/genson.py -i 2 -s     x3d.json >> x3d.json
split -p '^{' x3d.json x3d.json
python bin/genson.py -i 2 -s x3d.jsonaa -s x3d.jsonab /Users/johncarlson/Downloads/www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter02-GeometryPrimitives/Box.json > x3dmerge.json 
John Carlson
la source
Tout d'abord, pouvez-vous fournir une réponse à unix.stackexchange.com/questions/211803/... ?
Dave
2

Il y a beaucoup d'outils mentionnés, mais un autre appelé inférenceur de schéma JSON pour mémoire:

https://github.com/rnd0101/json_schema_inferencer

(ce n'est pas une bibliothèque ou un produit, mais un script Python)

Avec la divulgation complète habituelle: je suis l'auteur.

Romain Susi
la source
1

Pour node.js> 6.0.0, il existe également le module json-schema-by-example .

Jérôme WAGNER
la source