Tool zum Generieren eines JSON-Schemas aus JSON-Daten [geschlossen]

177

Wir haben diesen json Schema Entwurf . Ich möchte ein Beispiel meiner JSON-Daten erhalten und ein Skelett für das JSON-Schema generieren, das ich manuell überarbeiten kann, indem ich Dinge wie Beschreibung, Erforderliches usw. hinzufüge, die aus den spezifischen Beispielen nicht abgeleitet werden können.

Zum Beispiel aus meiner Eingabe example.json:

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

Ich würde mein Tool json_schema_generator ausführen und erhalten:

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

Dieses Beispiel wurde manuell codiert, daher weist es möglicherweise Fehler auf. Gibt es ein Tool, das mir bei der Konvertierung von JSON -> JSON-Schema helfen könnte?

blueFast
quelle
Aber woher weiß das Tool, dass es sich nicht um eine generische Zuordnung von Zeichenfolgen zu Zeichenfolgen handelt?
Hmakholm verließ Monica
1
In dem bereitgestellten Beispiel würde ich sagen, dass es klar ist, dass wir ein Wörterbuch (Python-Terminologie) mit Schlüssel-Wert-Paaren haben, in dem die Werte zufällig Zeichenfolgen sind. Ich kenne kein anderes JSON-Schema, das dieselben Daten beschreiben würde. Und dies ist nur ein einfaches Beispiel: Es könnte natürlich viel komplizierter werden, wie im JSON-Schemaentwurf angegeben.
blueFast
3
Sie behaupten also, dass "Zuordnung von beliebigen Zeichenfolgen zu anderen beliebigen Zeichenfolgen" (z. B. Zuordnung von Dateinamen zu Beschreibungen des Inhalts) nicht als JSON-Schema ausgedrückt werden kann? Soweit ich weiß, mag das wahr sein, aber es würde diese Art von Schemata meiner Ansicht nach ziemlich nutzlos machen.
Hmakholm verließ Monica
1
Mmmm, ich bin nicht sicher, ob wir etwas diskutieren, das für die Frage relevant ist, aber trotzdem. Verwenden wir ein besseres Beispiel: Feste Schlüssel in den JSON-Daten sind auf jeden Fall nützlich, wenn diese JSON-Daten beispielsweise die Eigenschaften einer Person beschreiben. Denken Sie anstelle von "foo" und "bar" an "Name" und "Nachname". "Name" und "Nachname" sind eindeutig feste Eigenschaften der Person-JSON-Daten, daher sind sie keine willkürlichen Zeichenfolgen: Sie sind Teil des Personenschemas. Die Werte sind natürlich beliebig, daher sind sie nicht Teil des Schemas.
blueFast
3
Feste Schlüssel zu haben ist manchmal das, was Sie wollen, und manchmal nicht. Das ist der springende Punkt: Ein automatisiertes Tool kann auf keinen Fall anhand einer einzelnen Stichprobe erkennen, welche der gewünschten Optionen Sie verwenden möchten.
Hmakholm verließ Monica

Antworten:

92

Vielleicht suchen Sie danach:

http://www.jsonschema.net

Es ist ein Online-Tool, das automatisch ein JSON-Schema aus einer JSON-Zeichenfolge generieren kann. Und Sie können das Schema einfach bearbeiten.

Grüne Su
quelle
3
Ein einfacher und praktischer Ausgangspunkt. Beachten Sie jedoch die gemeldeten Probleme mit jsonschema.net, die an anderer Stelle auf dieser Seite aufgeführt sind, und die Gründe, warum ein Offline- oder zumindest API-zugängliches Tool in Entwicklungsworkflows aufgenommen werden soll, um die Aktualisierung von Schemas mit einem späteren Beispiel zu ermöglichen usw. Siehe auch das Nizza Liste der Optionen von Steve Bennett.
Nealmcb
Bitte beachten Sie, dass diese Site beim Bearbeiten des Schemas nach dem ersten Import unerwartete Fehler auslöst.
Coreus
1
Abstürze für so etwas wie {"hello": "world","num": 42}sieht aber vielversprechend aus
DBX12
3
Die alten Seiten waren definitiv nicht gut genug. JSONSchema.Net wurde jetzt neu geschrieben. Es ist viel robuster. Wenn Sie irgendwelche Probleme haben, melden Sie sie bitte auf GitHub und ich werde sie gerne beheben: github.com/jackwootton/json-schema
Jack
jsonschema2pojo.org ist das, was ich seit Jahren benutze
Jemand irgendwo
83

Zusammenfassend die anderen Antworten, hier sind die bisher vorgeschlagenen JSON-Schema-Generatoren:

Online:

Python:

NodeJS:

Rubin:

Steve Bennett
quelle
jskemetor - neinsetup.py
Att Righ
Gibt es eine Chance, dass Sie wissen, ob einer dieser YAML-Eingänge unterstützt wird? Wir könnten konvertieren, aber nur einen zusätzlichen Schritt.
DylanYoung
28

GenSON ( PyPI | Github ) ist ein JSON-Schema-Generator, der aus mehreren Objekten ein einzelnes Schema generieren kann. Sie können auch Schemas damit zusammenführen. Es ist in Python geschrieben und wird mit einem CLI-Tool geliefert.

(Vollständige Offenlegung: Ich bin der Autor.)

Wolverdude
quelle
1
Gute Arbeit, Mann! Ich bedauere, dass ich das nicht gefunden habe, bevor ich anfing, an Skinfer zu arbeiten: github.com/scrapinghub/skinfer
Elias Dorneles
1
Keine Python, aber hier ist eine andere github.com/snowplow/schema-guru
chuwy
1
Toll! Ich war vom Online-Schema-Generator jsonschema.net enttäuscht (er kann für die meisten Objekte keine "erforderlichen" Eigenschaften erstellen, hat keine Optionen zum Erstellen kompakter (einzeiliger) Eigenschaften oder zum Weglassen von IDs und generiert vor allem ein Schema, das Die Daten, mit denen sie für Arrays mit einem Schema erstellt wurden, können nicht überprüft werden. Ich freue mich darauf, Ihr Werkzeug auszuprobieren.
Dave
@ Dave - Ich bin auch mit ähnlichen Problemen mit json schema.net konfrontiert. Hat dieses Python-Tool geholfen?
Cshah
1
@Cshah: Ich bin sehr beeindruckt von GenSON und habe einen Patch dazu beigetragen. Ich musste restriktivere Schemas generieren, als es dem Autor vertraut war, daher gabelte ich eine Version mit Optionen zum Generieren von Mustereigenschaften und zusätzlichen Eigenschaften / zusätzlichen Elementen, damit nicht erkannte JSON-Daten als aufmerksam gekennzeichnet werden.
Dave
6

Nach einigen Monaten ist die beste Antwort, die ich habe, mein einfaches Werkzeug. Es ist roh aber funktional.

Was ich will , ist etwas Ähnliches wie dieses . Die JSON-Daten können ein Grundgerüst für das JSON-Schema bereitstellen. Ich habe es noch nicht implementiert, aber es sollte möglich sein, ein vorhandenes JSON-Schema als Basis anzugeben, damit das vorhandene JSON-Schema plus JSON-Daten ein aktualisiertes JSON-Schema generieren kann. Wenn kein solches Schema als Eingabe angegeben wird, werden vollständig Standardwerte verwendet.

Dies wäre bei der iterativen Entwicklung sehr nützlich: Wenn das Tool zum ersten Mal ausgeführt wird, ist das JSON-Schema Dummy, kann jedoch entsprechend der Datenentwicklung automatisch verfeinert werden.

blueFast
quelle
2
Neugierig, wie der Vorschlag von @Green Su Ihren Anforderungen nicht entsprach. Ich denke, Sie beschreiben ein Dienstprogramm, das Starthilfe bietet (Ihr Begriff ist "Skelett") - so etwas wie ein Gerüstcode-Generator?
JustSteve
13
Grundsätzlich besteht das Problem bei diesem Tool darin, dass es sich um ein Online- Tool handelt. Ich brauche es, um es lokal in meiner Entwicklungsumgebung auszuführen, manchmal automatisch als Teil anderer Aufgaben. Ein Tool "hier kopieren, dort einfügen" hilft mir nicht. Wenn es eine REST-API hätte, wäre das gut genug.
blueFast
2
@justSteve: Das Online-Tool verwendet nicht nur einen Workflow zum Kopieren und Einfügen, sondern erscheint auch weiterhin fehlerhaft (4 Jahre nach der ursprünglichen Frage). Ich habe JSON-Objekte, für die das Tool falsche Schemas erstellt, diese jedoch noch nicht auf minimale Testfälle reduziert hat, um sie als Fehlerberichte einzureichen.
Dave
5

Es gibt ein Python-Tool zum Generieren eines JSON-Schemas für einen bestimmten JSON: https://github.com/perenecabuto/json_schema_generator

Vinícius Mendes
quelle
4
Dies wird seit 2013 nicht mehr gepflegt. Python 3 wird nicht unterstützt. Außerdem wird nur ein älterer Entwurf unterstützt, d draft-03. H.
Acumenus
5

generate-schema( NPM | Github ) nimmt ein JSON-Objekt, generiert daraus Schemas, eine Ausgabe ist JSON Schema, es ist in Node.js geschrieben und wird mit einem REPL- und ClI-Tool zum Weiterleiten von Dateien geliefert.

Vollständige Offenlegung: Ich bin der Autor :)

Nijikokun
quelle
Gibt es Pläne, das Modul auf Entwurf 4+ zu aktualisieren? Hinzufügen von min, max attrs, Referenzen und so weiter? Danke übrigens für das Tool :) Wird es in meinem Projekt verwenden
Mr. Alien
5

Unter https://github.com/krg7880/json-schema-generator gibt es ein nodejs-Tool, das json schema v4 unterstützt

Es funktioniert entweder als Befehlszeilenprogramm oder als NodeJS-Bibliothek:

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

schemaObj = jsonSchemaGenerator(json);
Johann Philipp Strathausen
quelle
1
Kommt auch mit einer CLI!
Peter Ilfrich
3

json-schema-generator ist ein ordentlicher Ruby-basierter JSON-Schema-Generator. Es unterstützt sowohl Entwurf 3 als auch Entwurf 4 des JSON-Schemas. Es kann als eigenständige ausführbare Datei ausgeführt oder in ein Ruby-Skript eingebettet werden.

Anschließend können Sie mit json-schema JSON-Beispiele anhand Ihres neu generierten Schemas validieren, wenn Sie möchten.

HappyCoder86
quelle
3

Für die Offline-Tools, die mehrere Eingaben unterstützen, ist das Beste, was ich bisher gesehen habe, https://github.com/wolverdude/GenSON/. Ich würde gerne ein Tool sehen, das Dateinamen für Standardeingaben verwendet, da ich Tausende von Dateien habe . Mir gehen jedoch die offenen Dateideskriptoren aus, stellen Sie also sicher, dass die Dateien geschlossen sind . Ich würde auch gerne JSON-Schema-Generatoren sehen, die die Rekursion verarbeiten. Ich arbeite jetzt daran, Java- Klassen aus JSON-Objekten zu generieren, in der Hoffnung, aus meinen Java-Klassen zum JSON-Schema zu wechseln. Hier ist mein GenSON-Skript, wenn Sie neugierig sind oder Fehler darin identifizieren möchten.

#!/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
quelle
Können Sie zunächst eine Antwort auf unix.stackexchange.com/questions/211803/… geben ?
Dave
2

Es werden viele Tools erwähnt, aber ein weiterer wird als JSON Schema Inferencer für den Datensatz bezeichnet:

https://github.com/rnd0101/json_schema_inferencer

(Es ist keine Bibliothek oder ein Produkt, sondern ein Python-Skript)

Mit der üblichen vollständigen Offenlegung: Ich bin der Autor.

Roman Susi
quelle
1

Für node.js> 6.0.0 gibt es auch das Modul json-schema-by-example .

Jerome WAGNER
quelle