Strumento per generare lo schema JSON dai dati JSON [chiuso]


178

Abbiamo questa bozza di schema json . Vorrei ottenere un campione dei miei dati JSON e generare uno scheletro per lo schema JSON, che posso rielaborare manualmente, aggiungendo cose come la descrizione, i requisiti, ecc., Che non possono essere dedotti dagli esempi specifici.

Ad esempio, dal mio input example.json:

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

Avrei eseguito il mio strumento json_schema_generator e avrei ottenuto:

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

Questo esempio è stato codificato manualmente, quindi potrebbe contenere errori. C'è qualche strumento là fuori che potrebbe aiutarmi con la conversione JSON -> schema JSON?


Ma come fa lo strumento a sapere che non è una mappa generica da stringhe a stringhe?
Hmakholm ha lasciato Monica il

1
Nell'esempio fornito, direi che è chiaro che abbiamo un dizionario (terminologia python), con coppie chiave-valore, in cui i valori sono stringhe. Non conosco nessun altro schema JSON che descriva gli stessi dati. E questo è solo un semplice esempio: potrebbe diventare molto più complicato, ovviamente, come specificato nella bozza dello schema JSON.
blueFast

3
Quindi stai affermando che "la mappatura da stringhe arbitrarie ad altre stringhe arbitrarie" (come una mappatura dai nomi dei file alle descrizioni del contenuto) non può essere espressa come uno schema JSON? Per quanto ne so, potrebbe essere vero, ma a mio avviso renderebbe quel tipo di schemi piuttosto inutili.
Hmakholm ha lasciato Monica l'

1
Mmmm, non sono sicuro che stiamo discutendo qualcosa di rilevante per la domanda, ma comunque. Facciamo un esempio migliore: avere chiavi fisse nei dati JSON è sicuramente utile se, ad esempio, i dati JSON descrivono le proprietà di una persona. Invece di "pippo" e "bar", pensa a "nome" e "cognome". "nome" e "cognome" sono proprietà chiaramente fisse dei dati JSON della persona, quindi non sono stringhe arbitrarie: fanno parte dello schema della persona. I valori sono ovviamente arbitrari, quindi non fanno parte dello schema.
blueFast

3
Avere chiavi fisse a volte è quello che vuoi, a volte no. Questo è tutto il punto in realtà: non c'è modo che uno strumento automatizzato possa rilevare da un singolo campione quale delle opzioni desiderate.
Hmakholm ha lasciato Monica l'

Risposte:


92

Potresti cercare questo:

http://www.jsonschema.net

È uno strumento online che può generare automaticamente lo schema JSON dalla stringa JSON. E puoi modificare facilmente lo schema.


3
Un posto facile e pratico per iniziare. Ma nota i problemi segnalati con jsonschema.net identificati altrove in questa pagina e i motivi discussi per volere uno strumento offline, o almeno accessibile alle API, da includere nei flussi di lavoro di sviluppo, consentire l'aggiornamento di schemi con un esempio successivo ecc. Vedi anche il simpatico elenco di opzioni di Steve Bennett.
nealmcb,

Si noti che questo sito genererà errori imprevisti durante la modifica dello schema dopo l'importazione iniziale.
Coreus,

1
Si blocca per qualcosa di simile {"hello": "world","num": 42}ma sembra promettente-
DBX12

3
I vecchi siti sicuramente non erano abbastanza buoni. JSONSchema.Net è stato ora riscritto. È molto più robusto. In caso di problemi, segnalali su GitHub e li risolverò volentieri: github.com/jackwootton/json-schema
Jack

jsonschema2pojo.org è quello che uso da anni
Someone Somewhere

83

jskemetor - nosetup.py
Att Righ

Qualche possibilità sai se qualcuno di questi supporta input YAML? Potremmo convertire, ma solo un ulteriore passo.
DylanYoung,

28

GenSON ( PyPI | Github ) è un generatore di schemi JSON che può generare un singolo schema da più oggetti. Puoi anche unire gli schemi con esso. È scritto in Python e viene fornito con uno strumento CLI.

(Informativa completa: sono l'autore.)


1
Bel lavoro, amico! Mi dispiace non averlo trovato prima di iniziare a lavorare su skinfer: github.com/scrapinghub/skinfer
Elias Dorneles,

1
Non un pitone, ma eccone un altro github.com/snowplow/schema-guru
chuwy

1
Grande! Sono rimasto deluso dal generatore di schemi online jsonschema.net (non riesce a creare proprietà "obbligatorie" per la maggior parte degli oggetti, non ha opzioni per produrre proprietà compatte (a una riga) o omettere ID e, soprattutto, genera uno schema che non riesce a convalidare i dati utilizzati per crearlo per array a schema singolo). In attesa di provare il tuo strumento.
Dave,

@Dave - sto affrontando problemi simili con json schema.net, questo strumento Python è stato di aiuto?
Cshah,

1
@Cshah: sono estremamente colpito da GenSON e ho contribuito con una patch. Avevo bisogno di generare schemi più restrittivi di quelli a cui l'autore era a suo agio, quindi ho creato una versione con opzioni per generare proprietà del modello e proprietà aggiuntive / elementi aggiuntivi in ​​modo che i dati JSON non riconosciuti vengano contrassegnati come bisognosi di attenzione.
Dave,


6

Dopo diversi mesi, la migliore risposta che ho è il mio semplice strumento. È crudo ma funzionale.

Quello che voglio è qualcosa di simile a questo . I dati JSON possono fornire uno scheletro per lo schema JSON. Non l'ho ancora implementato, ma dovrebbe essere possibile fornire uno schema JSON esistente come base, in modo che lo schema JSON esistente più i dati JSON possano generare uno schema JSON aggiornato. Se tale schema non viene fornito come input, vengono presi valori completamente predefiniti.

Ciò sarebbe molto utile nello sviluppo iterativo: la prima volta che lo strumento viene eseguito, lo schema JSON è fittizio, ma può essere perfezionato automaticamente in base all'evoluzione dei dati.


2
Curioso di come il suggerimento di @Green Su non sia stato all'altezza delle tue esigenze. Penso che stai descrivendo un'utilità che fornisce jumpstarter (il tuo termine è "scheletrico") - qualcosa come un generatore di codice di ponteggi?
JustSteve

13
Fondamentalmente, il problema con quello strumento è che si tratta di uno strumento online . Ne ho bisogno per eseguirlo localmente nel mio ambiente di sviluppo, a volte automaticamente come parte di altre attività. Uno strumento "copia qui, incolla lì" non mi aiuta. Se avesse un'API REST sarebbe abbastanza buona.
blueFast

2
@justSteve: lo strumento online, oltre a utilizzare un flusso di lavoro copia-incolla, appare ancora errato (4 anni dopo la domanda originale). Ho oggetti json per i quali lo strumento produce schemi errati ma non li ho ancora ridotti a casi di test minimi da inviare come segnalazioni di bug.
Dave,


5

generate-schema( NPM | Github ) prende un oggetto JSON genera schemi da esso, un output è JSON Schema, è scritto in Node.js e viene fornito con uno strumento REPL e ClI per il piping dei file.

Divulgazione completa: sono l'autore :)


Hai in programma di aggiornare il modulo in bozza 4+? Aggiungere min, max attr, riferimenti e così via? Grazie per lo strumento tra l'altro :) Lo userò nel mio Progetto
Mr. Alien il


3

json-schema-generator è un generatore di schemi JSON basato su Ruby. Supporta sia le bozze 3 che 4 dello schema JSON. Può essere eseguito come eseguibile autonomo o può essere incorporato all'interno di uno script Ruby.

Quindi è possibile utilizzare json-schema per convalidare campioni JSON sullo schema appena generato, se lo si desidera.


3

Per gli strumenti offline che supportano più input, il migliore che ho visto finora è https://github.com/wolverdude/GenSON/ Mi piacerebbe vedere uno strumento che accetta nomi di file sull'input standard perché ho migliaia di file . Tuttavia, ho esaurito i descrittori di file aperti, quindi assicurati che i file siano chiusi . Mi piacerebbe anche vedere i generatori di schemi JSON che gestiscono la ricorsione. Ora sto lavorando per generare classi Java da oggetti JSON nella speranza di andare a JSON Schema dalle mie classi Java. Ecco il mio script GenSON se sei curioso o vuoi identificare i bug in esso.

#!/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 

Innanzitutto, puoi fornire una risposta a unix.stackexchange.com/questions/211803/… ?
Dave,


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.