Przejdź do treści
Toova
Wszystkie narzędzia

JSON na TypeScript, Go, Python, PHP, Rust

Prywatne z założenia — działa w całości w Państwa przeglądarce

Wywnioskowanie poprawnych definicji typów z prawdziwej odpowiedzi API to jedno z tych zadań, które powinno zająć pięć sekund, a jakoś zżera piętnaście minut. To narzędzie czyta próbkę JSON w Twojej przeglądarce, przechodzi przez strukturę i emituje idiomatyczne typy dla TypeScript, Go, Python, PHP lub Rust — z polami opcjonalnymi, wykrywaniem dat ISO i poprawnym rozróżnieniem liczby całkowitej od zmiennoprzecinkowej.

Jak działa wnioskowanie

Narzędzie przechodzi przez drzewo JSON raz, budując reprezentację pośrednią: prymitywy stają się string / int / float / bool / null, tablice wnioskują typ elementu z sumy swoich członków, a obiekty produkują strukturę, której typy pól pochodzą z wartości. Gdy to samo pole pojawia się w niektórych elementach tablicy, a w innych nie, jest oznaczane jako opcjonalne — wygenerowany typ może dekodować częściowe dane bez awarii. Liczby bez części ułamkowej są emitowane jako int64 (Go) / int (Python) / i64 (Rust), a liczby z częścią ułamkową jako float64 / float / f64. Łańcuchy pasujące do ISO 8601 (`2024-03-15T10:30:00Z`) stają się Date / time.Time / datetime / DateTimeInterface / chrono::DateTime.

Styl wyjścia dla każdego języka

Każdy emiter podąża za konwencjami języka docelowego. TypeScript: eksportowane interfejsy ze składnią `?:`. Go: struktury z tagami `json:`, pola opcjonalne jako wskaźniki z `omitempty`. Python: `@dataclass` z polami wymaganymi pierwszymi i `Optional[T] = None` na końcu (reguła porządkowania dataclass). PHP: klasy final z surowym typowaniem i wskazówkami phpdoc `@var list<T>` dla tablic typowanych. Rust: struktury z `#[derive(Serialize, Deserialize)]`, `Option<T>` dla pól nullowalnych i `#[serde(rename)]`, gdy nazwa snake_case w Rust różni się od klucza JSON.

Kiedy używać (a kiedy nie)

Ten generator rozwiązuje pierwsze 80% pracy: uzyskanie działającej definicji typu z payloadu w kilka sekund. Nie zastępuje schematu pisanego ręcznie, gdy potrzebujesz precyzyjnych ograniczeń (regex na łańcuchach, min/max na liczbach, sumy dyskryminowane). W tych przypadkach weź wyjście jako punkt startowy i zacieśnij typy. Wykrywanie pól opcjonalnych jest heurystyczne — oparte na tym, co jest w próbce — więc przepuść kilka różnorodnych próbek, jeśli możesz.

Najczęściej zadawane pytania

Czy JSON, który wklejam, opuszcza moją przeglądarkę?
Nie. Parser, wnioskowanie typów i emisja kodu — wszystko działa w JavaScript wewnątrz karty. Otwórz panel Network podczas generowania — zobaczysz zero żądań wychodzących. Bezpieczne dla produkcyjnych payloadów z prawdziwymi tokenami i PII.
Dlaczego moje pole jest oznaczone jako opcjonalne, skoro zawsze ma wartość?
Flaga opcjonalna jest ustawiana, gdy tablica zawiera obiekty z tym polem i niektóre bez. Jeśli wklejasz pojedynczy obiekt, nic nie jest oznaczane jako opcjonalne. Jeśli wklejasz tablicę identycznych obiektów, też nie. Flaga uruchamia się tylko wtedy, gdy struktura wewnątrz tablicy jest różna.
Jak rozróżnia się liczbę całkowitą i zmiennoprzecinkową?
JSON ma tylko jeden typ liczbowy. Narzędzie sprawdza każdą wartość i emituje int, gdy wartość nie ma części ułamkowej (`42`, `1000`), i float, gdy ma (`3.14`, `99.0`). Jeśli tablica miesza oba, typ jest rozszerzany do float, aby uniknąć dekodowania z utratą.
Czy wykrywa łańcuchy dat ISO?
Tak. Łańcuchy pasujące do `YYYY-MM-DD` lub `YYYY-MM-DDTHH:MM:SS[.sss][Z|±HH:MM]` są emitowane jako natywny typ daty/czasu języka (Date w TS, time.Time w Go, datetime w Python, DateTimeInterface w PHP, chrono::DateTime w Rust). Inne formaty pozostają jako string.
Czy muszę coś zainstalować, aby używać wygenerowanego kodu?
TypeScript: nic — czysty. Go: tylko biblioteka standardowa (time.Time, gdy są daty ISO). Python: standardowy moduł dataclasses. PHP: typy natywne. Rust: wymaga serde + chrono, gdy są daty ISO. Nagłówki/importy są wpisywane do wyjścia, gdzie to ma zastosowanie.
Czy mogę generować typy dla tablicy obiektów w root?
Tak. Jeśli wartość root jest tablicą obiektów, narzędzie emituje strukturę dla elementu i alias typu najwyższego poziomu dla tablicy. Na przykład JSON `[{...}, {...}]` o nazwie `Users` produkuje interfejs `User` plus `type Users = User[];` w TypeScript, lub `pub type Users = Vec<User>;` w Rust.