Konwerter Rust na JSON
Wklej structy Rust z derive Serialize. Odbierz czysty JSON.
Co robi to narzędzie
Jeśli kiedyś zdefiniowałeś struct, przykleiłeś na nim #[derive(Serialize)] i zorientowałeś się, że tak naprawdę potrzebujesz tylko JSON-a — bez pisania boilerplate'u serde, dodawania serde_json do Cargo.toml i odpalania cargo run — to narzędzie robi dokładnie to. Wklej Rusta tutaj i odbierz poprawny JSON bez dotykania carga. Radzi sobie z pojedynczym literałem struct, całym modułem z kilkoma typami czy czymś z głęboko zagnieżdżonymi Vec i Option — ten sam efekt: czysty dokument JSON, w którym każde pole zostało zachowane.
Konwerter trzyma się tego, jak serde faktycznie serializuje wartości. String i &str stają się stringami JSON. i32, u64, f32, f64 — liczbami JSON. bool — true/false. Vec<T>, &[T] i [T; N] stają się tablicami JSON. HashMap<String, V> / BTreeMap<String, V> — obiektami JSON. Option<T> z None to JSON-owy null; z Some(value) serializowany jest typ wewnętrzny. Tuple wychodzą jako tablice heterogeniczne — dokładnie takie zachowanie opisano na serde.rs/data-model.
Atrybuty serde są honorowane. #[serde(rename = "x")] zmienia nazwę klucza JSON, #[serde(skip)] usuwa pole, a #[serde(flatten)] podnosi pola zagnieżdżonego structa do obiektu nadrzędnego. Typy enum domyślnie korzystają z reprezentacji externally-tagged (konfigurowalne przez #[serde(tag = "type")]). Wklej kilka structów naraz i każdy wypadnie jako wpis najwyższego poziomu. Jeśli dłubiesz w serwisach webowych opartych o bibliotekę standardową Rusta plus axum/actix, ten wynik wpada prosto w twoje testy integracyjne.
Jak tego użyć
Trzy kroki. Działa tak samo, czy wklejasz jeden struct, czy cały moduł z tuzinem typów.
Wklej swój Rust (albo wczytaj przykład)
Wrzuć swój Rust do lewego edytora tak, jak jest. struct, tuple struct, enum z wariantami, wiele typów albo zagnieżdżone Vec/Option/HashMap — wszystko gra. Kliknij Załaduj przykład, żeby najpierw zobaczyć realistyczny przypadek.
Nie musisz usuwać use, lifetime'ów ani atrybutów derive. Zostaw składnię Rusta taką, jaka jest — atrybuty serde są częścią tego, co parser czyta.
Kliknij Konwertuj
Kliknij zielony przycisk Konwertuj. Narzędzie czyta Rusta, zachowuje każdy struct i każde pole i wyrzuca JSON za jednym zamachem. Podczas pracy miga krótki wskaźnik ładowania.
Skopiuj JSON
Prawy panel wypełni się wciętym JSON-em. Skopiuj go do testu z reqwest, testu integracyjnego axum, przykładów OpenAPI albo komendy curl. Żadnego rebuildu.
Kiedy to naprawdę się przydaje
Fixturki dla serwisów webowych
Masz structa request-a z axum albo actix i potrzebujesz JSON-a do testu lub curla. Wklejasz structa, bierzesz JSON, idziesz dalej — bez cyklu cargo.
Szablony configów dla CLI
CLI oparte o clap ze structem Config. Skonwertuj go na szablon JSON, który użytkownicy mogą edytować, bez pisania własnej impl <code>Default</code> tylko pod dokumentację.
Seedy do testów integracyjnych
Zamień literały structów z twoich testów jednostkowych na pliki JSON-owe z danymi seedującymi dla testów integracyjnych, mock-serwerów albo fixturek dla osadzonych baz danych.
Dokumentacja, która nie odstaje od kodu
Generuj przykłady JSON do README albo specyfikacji OpenAPI prosto z prawdziwych typów Rusta, żeby dokumentacja przestała się rozjeżdżać.
Najczęstsze pytania
Czy potrzebuję serde i serde_json w Cargo.toml?
Do tego narzędzia — nie. Działa po stronie serwera i nie kompiluje twojego kodu. Do użycia w runtime we własnej aplikacji standardowy zestaw to serde z feature'em derive plus serde_json.
Czy honoruje #[serde(rename)], #[serde(skip)] i #[serde(flatten)]?
Tak. #[serde(rename = "x")] zmienia nazwę klucza JSON, #[serde(skip)] wycina pole z wyniku, a #[serde(flatten)] podnosi pola zagnieżdżonego structa do rodzica — zgodnie z dokumentacją serde field attributes.
Jak traktowane są Option, Vec i HashMap?
Option<T> z None to JSON-owy null; z Some(v) serializowana jest wartość wewnętrzna. Vec<T>, slice'y i tablice stają się tablicami JSON. HashMap<String, V> i BTreeMap<String, V> — obiektami JSON; mapy z kluczami nie-stringowymi mają klucze rzutowane na stringi.
A co z enumami z wariantami?
Domyślnie warianty enum używają reprezentacji externally-tagged ({ "VariantName": {...} }). Atrybuty #[serde(tag = "type")], #[serde(untagged)] i #[serde(content = "data")] przełączają na internally-tagged, untagged albo adjacently-tagged — narzędzie czyta te atrybuty i odpowiednio formatuje wynik.
Czy mój kod jest przechowywany?
Twój kod jest wysyłany do backendu w celu konwersji i nie jest trwale przechowywany — nie logujemy payloadu. Jeśli wklejasz wrażliwy kod, rzuć na niego okiem wcześniej.
Co jeśli Rust używa lifetime'ów albo generyków?
Lifetime'y (&'a str) są ignorowane — JSON nie ma takiego pojęcia. Konkretne generyki (Vec<User>) działają. Nieużyte (nieinstancjonowane) generyki wychodzą jako null. Makra, które rozwijają się do realnej składni, działają; makra oparte o proc-macro crate niewidoczny tutaj są traktowane jako nieprzezroczyste.
Inne narzędzia, które mogą się przydać
Rust do JSON to tylko jeden element układanki. Te dobrze się z tym komponują: