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.