Rust’tan JSON’a Dönüştürücü
Serialize derive’lı Rust struct’larını yapıştır. Tertemiz JSON’u geri al.
Bu araç ne yapar
Daha önce bir struct tanımlayıp üzerine #[derive(Serialize)] yapıştırdıysan ve aslında sadece JSON’u istediğini, serde boilerplate’ı yazmak, Cargo.toml’a serde_json eklemek ve cargo run çalıştırmak istemediğini fark ettiysen — bu araç tam olarak onu yapıyor. Rust kodunu buraya yapıştır ve cargo’ya dokunmadan geçerli JSON’u geri al. Tek bir struct da olsa, birçok tip içeren koca bir module da olsa, derin iç içe Vec ve Option’lı bir şey de olsa — sonuç aynı: her alanı korunmuş, tertemiz bir JSON belgesi.
Dönüştürücü, serde’nin değerleri gerçekte nasıl serileştirdiğini birebir takip eder. String ve &str, JSON string’e döner. i32, u64, f32, f64 hepsi JSON sayısı olur. bool, true/false’a döner. Vec<T>, &[T] ve [T; N], JSON dizisine döner. HashMap<String, V> / BTreeMap<String, V>, JSON nesnesine döner. Option<T> None ise JSON null’a; Some(value) ise içteki tip serileştirilir. Tuple’lar heterojen diziler olarak çıkar — kesin davranış serde.rs/data-model adresinde belgelenmiştir.
Serde öznitelikleri dikkate alınır. #[serde(rename = "x")] JSON anahtarını yeniden adlandırır, #[serde(skip)] alanı kaldırır ve #[serde(flatten)] iç içe struct’ın alanlarını üst nesneye taşır. enum tipleri varsayılan olarak externally-tagged gösterimi kullanır (#[serde(tag = "type")] ile yapılandırılabilir). Birden fazla struct’ı birden yapıştırırsan her biri üst seviye giriş olarak çıkar. Rust standart kütüphanesi ve axum/actix üzerine kurulu web servisleri yazıyorsan, bu çıktı entegrasyon testlerine doğrudan düşer.
Nasıl kullanılır
Üç adım. Tek bir struct yapıştırsan da on iki tip içeren koca bir module yapıştırsan da aynı şekilde çalışır.
Rust’ını yapıştır (ya da örneği yükle)
Rust kodunu sol editöre olduğu gibi bırak. struct, tuple struct, varyantlı enum, birden fazla tip ya da iç içe Vec/Option/HashMap — hepsi olur. Önce gerçekçi bir örnek görmek için Örneği Yükle’ye tıkla.
use ifadelerini, lifetime’ları veya derive özniteliklerini kaldırmana gerek yok. Rust sözdizimini olduğu gibi bırak — serde öznitelikleri parser’ın okuduğu şeyin parçası.
Dönüştür’e bas
Yeşil Dönüştür butonuna tıkla. Araç Rust’ı okur, her struct’ı ve her alanı korur ve JSON’u tek seferde çıkarır. İşlem sırasında kısa bir yükleme göstergesi döner.
JSON’u kopyala
Sağdaki panel girintili JSON ile dolar. Bunu bir reqwest testine, axum entegrasyon testine, OpenAPI örneklerine veya curl komutuna yapıştır. Yeniden derlemeye gerek yok.
Gerçekten ne zaman işe yarıyor
Web servis fixture’ları
Axum veya actix request struct’ın var ve bir test ya da curl çağrısı için JSON’a ihtiyacın var. Struct’ı yapıştır, JSON’u al, devam et — cargo döngüsü yok.
CLI için config şablonları
Config struct’ı olan clap tabanlı bir CLI. Sadece doküman için özel bir <code>Default</code> impl yazmadan, kullanıcıların düzenleyebileceği bir JSON şablonuna çevir.
Entegrasyon testi seed’leri
Birim testlerindeki struct literal’larını entegrasyon testleri, mock sunucular ya da gömülü veritabanı fixture’ları için JSON seed dosyalarına dönüştür.
Kodu takip eden doküman
README’n veya OpenAPI spec’in için JSON örneklerini doğrudan gerçek Rust tiplerinden üret, böylece doküman kodla arası açılmasın.
Sık sorulan sorular
Cargo.toml’da serde ve serde_json’a ihtiyacım var mı?
Bu araç için yok — sunucu tarafında çalışır ve senin kodunu derlemez. Kendi uygulamanda çalışma zamanında kullanmak için derive özelliği ile serde ve serde_json standart ikilidir.
#[serde(rename)], #[serde(skip)] ve #[serde(flatten)]’ı dikkate alıyor mu?
Evet. #[serde(rename = "x")] JSON anahtarını yeniden adlandırır, #[serde(skip)] alanı çıktıdan kaldırır ve #[serde(flatten)] iç içe struct alanlarını üste taşır — serde field attributes dokümanıyla birebir.
Option, Vec ve HashMap nasıl ele alınıyor?
Option<T> None ise JSON null’a; Some(v) ise içteki değer serileştirilir. Vec<T>, slice’lar ve diziler JSON dizilerine döner. HashMap<String, V> ve BTreeMap<String, V>, JSON nesnelerine döner; string olmayan anahtarlı map’lerin anahtarları string’e çevrilir.
Varyantlı enum’lar için durum ne?
Varsayılan olarak enum varyantları externally-tagged gösterimi kullanır ({ "VariantName": {...} }). #[serde(tag = "type")], #[serde(untagged)] ve #[serde(content = "data")] öznitelikleri internally-tagged, untagged ya da adjacently-tagged’e geçirir — araç bu öznitelikleri okur ve buna göre çıktı üretir.
Kodum saklanıyor mu?
Kodun dönüştürme için backend’e gönderilir ve kalıcı olarak saklanmaz — payload’ı log’lamıyoruz. Hassas kodu yapıştırmadan önce bir göz atıvermekte fayda var.
Rust kodunda lifetime veya generic varsa ne olur?
Lifetime’lar (&'a str) yok sayılır — JSON’da böyle bir kavram yok. Somutlaştırılmış generic’ler (Vec<User>) çalışır. Örneklendirilmemiş generic’ler null olarak çıkar. Gerçek sözdizimine genişleyen makrolar çalışır; burada görünmeyen bir proc-macro crate’ine bağımlı makrolar saydam olmayan olarak ele alınır.
İşine yarayabilecek diğer araçlar
Rust’tan JSON’a yalnızca yap-bozun bir parçası. Bunlar onunla iyi gider: