JSON
- Rust kursu
- Orta seviye
- Ders 103/115
- 4 dk
serde_json ile JSON okur ve yazarsın.
JSON
serde_json iki yönde çalışır: to_string / to_string_pretty yazar, from_str okur. Okuma başarısız olabilir (eksik alan, yanlış tür), bu yüzden Result döndürür:
let k = Kitap { ad: "Dune".into(), yil: 1965 };
let metin = serde_json::to_string(&k)?;
let geri: Kitap = serde_json::from_str(&metin)?;
// türü bilinmeyen JSON için
let v: serde_json::Value = serde_json::from_str(r#"{"a":[1,2]}"#)?;
println!("{}", v["a"][1]); // 2r#"..."# ham metindir; içindeki tırnakları kaçışlamak gerekmez.
Basit bir okuyucu
Tam bir JSON ayrıştırıcısı yazmak büyük iştir; ama düz (iç içe olmayan) bir nesneyi parçalamak, from_str'in ne yaptığını anlamaya yeter:
fn duz_oku(json: &str) -> BTreeMap<String, String> {
json.trim()
.trim_start_matches('{')
.trim_end_matches('}')
.split(',')
.filter_map(|cift| cift.split_once(':'))
.map(|(a, d)| (a.trim().trim_matches('"').to_string(),
d.trim().trim_matches('"').to_string()))
.collect()
}Bu okuyucu metin içindeki virgülleri ya da iç içe nesneleri ele almaz; gerçek projede her zaman serde_json kullan.
Uygulama Düz nesne oku
Yukarıdaki duz_oku fonksiyonunu yaz. {"ad":"Ece","yas":30} metnini oku ve sonucu {:?} ile yazdır.
Başlangıç kodu
use std::collections::BTreeMap;
fn main() {
// buraya yaz
}Örnek çözüm
use std::collections::BTreeMap;
fn duz_oku(json: &str) -> BTreeMap<String, String> {
json.trim()
.trim_start_matches('{')
.trim_end_matches('}')
.split(',')
.filter_map(|cift| cift.split_once(':'))
.map(|(a, d)| (a.trim().trim_matches('"').to_string(), d.trim().trim_matches('"').to_string()))
.collect()
}
fn main() {
println!("{:?}", duz_oku(r#"{"ad":"Ece","yas":30}"#));
}Beklenen çıktı
{"ad": "Ece", "yas": "30"}
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>from_str::<Kitap>(r#"{"ad":"Dune"}"#)</code> ne döndürür? (yil eksik)
- Ok, yil = 0
- Panic
- Ok, yil = None
- Err: missing field `yil` Doğru cevap
Açıklama: Eksik alan varsayılan olarak hatadır. İsteğe bağlı alanlar Option ya da #[serde(default)] ile işaretlenir.
2 JSON'dan oku
let geri: Kitap = serde_json::____(&metin)?;
let geri: Kitap = serde_json::from_str(&metin)?;
Açıklama: from_str JSON metnini hedef türe çevirir.
3 Fonksiyon ve işi
| Kavram | Anlamı |
|---|---|
to_string |
Tek satır JSON |
to_string_pretty |
Girintili JSON |
from_str |
JSON → tür |
Value |
Türsüz JSON |