Wklej Rust po lewej i kliknij "Konwertuj" — zamienimy go w JSONWklej kod Rust

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. booltrue/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.

1

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.

2

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.

3

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ą: