Narzędzie do generowania schematu JSON z danych JSON [zamknięte]

178

Mamy ten szkic schematu JSON . Chciałbym pobrać próbkę moich danych JSON i wygenerować szkielet schematu JSON, który mogę przerobić ręcznie, dodając takie rzeczy, jak opis, wymagane itp., Które nie mogą być wywnioskowane z konkretnych przykładów.

Na przykład z mojego wejścia example.json:

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

Uruchomiłbym moje narzędzie json_schema_generator i uzyskałbym:

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

Ten przykład został zakodowany ręcznie, więc może zawiera błędy. Czy jest jakieś narzędzie, które mogłoby mi pomóc w konwersji schematu JSON -> JSON?

blueFast
źródło
Ale skąd narzędzie ma wiedzieć, że nie jest to ogólna mapa z ciągów znaków na łańcuchy?
hmakholm zostawił Monikę
1
W podanym przykładzie powiedziałbym, że jest jasne, że mamy słownik (terminologia Pythona) z parami klucz-wartość, w których wartości są łańcuchami. Nie znam żadnego innego schematu JSON, który opisywałby te same dane. A to tylko prosty przykład: może się to oczywiście stać znacznie bardziej skomplikowane, jak określono w wersji roboczej schematu JSON.
blueFast,
3
Więc twierdzisz, że „odwzorowanie z dowolnych ciągów na inne arbitralne ciągi” (na przykład odwzorowanie nazw plików na opisy zawartości) nie może być wyrażone jako schemat JSON? Z tego, co wiem, może to prawda, ale w mojej opinii tego rodzaju schematy byłyby raczej bezużyteczne.
hmakholm zostawił Monikę
1
Mmmm, nie jestem pewien, czy rozmawiamy o czymś istotnym dla tego pytania, ale i tak. Skorzystajmy z lepszego przykładu: posiadanie stałych kluczy w danych JSON jest zdecydowanie przydatne, jeśli te dane JSON opisują na przykład właściwości osoby. Zamiast „foo” i „bar” pomyśl o „imieniu” i „nazwisku”. „imię” i „nazwisko” są wyraźnie ustalonymi właściwościami danych JSON osoby, więc nie są to dowolne ciągi znaków: są częścią schematu osoby. Wartości są oczywiście dowolne, więc nie są częścią schematu.
blueFast,
3
Posiadanie stałych kluczy jest czasem tym, czego chcesz, a czasami nie. W rzeczywistości o to chodzi: nie ma możliwości, aby zautomatyzowane narzędzie wykryło na podstawie jednej próbki, którą z opcji chcesz.
hmakholm zostawił Monikę

Odpowiedzi:

92

Być może szukasz tego:

http://www.jsonschema.net

Jest to narzędzie online, które może automatycznie generować schemat JSON z ciągu JSON. I możesz łatwo edytować schemat.

Zielony Su
źródło
3
Łatwe i wygodne miejsce do rozpoczęcia. Zwróć jednak uwagę na zgłoszone problemy z jsonschema.net zidentyfikowane w innym miejscu na tej stronie oraz omówione powody, dla których warto mieć narzędzie offline lub przynajmniej dostępne za pośrednictwem interfejsu API, które można uwzględnić w przepływach pracy programistycznych, umożliwia aktualizację schematów za pomocą późniejszego przykładu itp. Zobacz także ładne lista opcji autorstwa Steve Bennett.
nealmcb
Należy pamiętać, że ta witryna będzie generować nieoczekiwane błędy podczas edycji schematu po początkowym imporcie.
Coreus
1
Awarie na przykład, {"hello": "world","num": 42}ale wygląda obiecująco
DBX12
3
Stare strony zdecydowanie nie były wystarczająco dobre. JSONSchema.Net został przepisany. Jest znacznie bardziej wytrzymały. Jeśli masz jakieś problemy, zgłoś je na GitHub, a chętnie je naprawię
Jack,
jsonschema2pojo.org jest tym, czego używam od lat
Someone Somewhere
83

Podsumowując pozostałe odpowiedzi, oto proponowane do tej pory generatory schematów JSON:

Online:

Pyton:

NodeJS:

Rubin:

Steve Bennett
źródło
jskemetor - nosetup.py
Att Righ
Czy wiesz, czy któryś z nich obsługuje wejścia YAML? Mogliśmy dokonać konwersji, ale to tylko dodatkowy krok.
DylanYoung
28

GenSON ( PyPI | Github ) to generator schematów JSON, który może generować pojedynczy schemat z wielu obiektów. Możesz także scalać z nim schematy. Został napisany w Pythonie i zawiera narzędzie CLI.

(Pełne ujawnienie: jestem autorem.)

wolverdude
źródło
1
Dobra robota, stary! Żałuję, że nie znalazłem tego, zanim zacząłem pracować nad skinfer: github.com/scrapinghub/skinfer
Elias Dorneles
1
To nie Python, ale oto kolejny github.com/snowplow/schema-guru
chuwy
1
Wspaniały! Byłem rozczarowany generatorem schematów online jsonschema.net (nie tworzy "wymaganych" właściwości dla większości obiektów, nie ma opcji tworzenia zwartych ( jednowierszowych ) właściwości lub pomijania identyfikatorów, a co najważniejsze, generuje schemat, który nie sprawdza poprawności danych użytych do ich utworzenia dla tablic o pojedynczym schemacie). Nie mogę się doczekać wypróbowania Twojego narzędzia.
Dave
@Dave - ja też mam podobne problemy z json schema.net, czy to narzędzie Pythona pomogło?
Cshah,
1
@Cshah: Jestem pod ogromnym wrażeniem GenSON i włożyłem do niego poprawkę. Musiałem wygenerować bardziej restrykcyjne schematy, z którymi autor nie czuł się komfortowo, więc rozwidliłem wersję z opcjami generowania właściwości wzorca i dodatkowych właściwości / dodatkowych elementów, aby nierozpoznane dane JSON były oznaczone jako wymagające uwagi.
Dave
6

Po kilku miesiącach najlepszą odpowiedzią jest moje proste narzędzie. Jest surowy, ale funkcjonalny.

Co chcę jest coś podobnego do tego . Dane JSON mogą stanowić szkielet schematu JSON. Nie zaimplementowałem go jeszcze, ale powinno być możliwe podanie istniejącego schematu JSON jako podstawy, aby istniejący schemat JSON plus dane JSON mógł wygenerować zaktualizowany schemat JSON. Jeśli nie podano takiego schematu jako dane wejściowe, przyjmowane są całkowicie domyślne wartości.

Byłoby to bardzo przydatne w programowaniu iteracyjnym: przy pierwszym uruchomieniu narzędzia schemat JSON jest fikcyjny, ale można go dopracować automatycznie zgodnie z ewolucją danych.

blueFast
źródło
2
Ciekawe, jak sugestia @Green Su nie spełniła Twoich potrzeb. Myślę, że opisujesz narzędzie, które zapewnia szybki start (twój termin to „szkieletowy”) - coś w rodzaju generatora kodu szkieletowego?
justSteve
13
Zasadniczo problem z tym narzędziem polega na tym, że jest to narzędzie online . Potrzebuję go do uruchamiania go lokalnie w moim środowisku programistycznym, czasami automatycznie w ramach innych zadań. Narzędzie „kopiuj tutaj, wklej tam” nie pomaga mi. Gdyby miał REST API, byłoby to wystarczająco dobre.
blueFast
2
@justSteve: narzędzie online, oprócz korzystania z przepływu pracy kopiuj-wklej, nadal wygląda na błędne (4 lata po pierwotnym pytaniu). Mam obiekty json, dla których narzędzie tworzy niepoprawne schematy, ale nie ograniczyłem ich jeszcze do minimalnej liczby przypadków testowych do przesłania jako zgłoszenia błędów.
Dave
5

Istnieje narzędzie Pythona do generowania schematu JSON dla danego JSON: https://github.com/perenecabuto/json_schema_generator

Vinícius Mendes
źródło
4
Nie jest utrzymywane od 2013 roku. Nie obsługuje Pythona 3. Ponadto obsługuje tylko starszą wersję roboczą, tj draft-03.
Acumenus
5

generate-schema( NPM | Github ) pobiera obiekt JSON generujący z niego schematy, jedno wyjście to schemat JSON, jest napisane w Node.js i jest dostarczane z narzędziem REPL i ClI do przesyłania plików do.

Pełne ujawnienie: jestem autorem :)

Nijikokun
źródło
Czy planujecie aktualizację modułu do wersji roboczej 4+? Dodajesz min, max atrybuty, referencje i tak dalej? Przy okazji dziękuję za narzędzie :) Będę go używać w moim projekcie
Mr. Alien
5

Istnieje narzędzie nodejs, które obsługuje schemat json v4 na https://github.com/krg7880/json-schema-generator

Działa jako narzędzie wiersza poleceń lub jako biblioteka nodejs:

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

schemaObj = jsonSchemaGenerator(json);
Johann Philipp Strathausen
źródło
1
W zestawie również CLI!
Peter Ilfrich
3

json-schema-generator to zgrabny generator schematów JSON oparty na Ruby. Obsługuje zarówno wersję roboczą 3, jak i 4 schematu JSON. Może być uruchamiany jako samodzielny plik wykonywalny lub może być osadzony w skrypcie Ruby.

Następnie możesz użyć schematu json-schema do sprawdzenia poprawności próbek JSON względem nowo wygenerowanego schematu, jeśli chcesz.

HappyCoder86
źródło
3

W przypadku narzędzi offline, które obsługują wiele wejść, najlepszym, jakie do tej pory widziałem, jest https://github.com/wolverdude/GenSON/ Chciałbym zobaczyć narzędzie, które przyjmuje nazwy plików na standardowe wejście, ponieważ mam tysiące plików . Jednak zabrakło mi otwartych deskryptorów plików, więc upewnij się, że pliki są zamknięte . Chciałbym również zobaczyć generatory schematów JSON, które obsługują rekursję. Obecnie pracuję nad generowaniem klas Java z obiektów JSON w nadziei, że z moich klas Java przejdę do schematu JSON. Oto mój skrypt GenSON, jeśli jesteś ciekawy lub chcesz zidentyfikować w nim błędy.

#!/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
źródło
Po pierwsze, czy możesz podać odpowiedź na unix.stackexchange.com/questions/211803/… ?
Dave