CodeBlanks Logo Icon CodeBlanks

JSON okuma

serde_json ile bir post listesi okursun.

Veriyi okumak

Gerçek projede yazılar bir JSON dizisinden tek satırla okunur:

let metin = fs::read_to_string("yazilar.json")?;
let yazilar: Vec<Yazi> = serde_json::from_str(&metin)?;

Alıştırmada dış crate olmadığı için daha basit bir kayıt biçimi kullanacağız: her kayıt bir satır, alanlar | ile, etiketler virgülle ayrılır:

1|Rust ile başlangıç|ece|rust,giriş|true
2|Sahiplik|can|rust|false

Kayıt ayrıştırma

Kayıt | ile bölünür; alan sayısı yanlışsa ya da bir alan çevrilemezse None döner. Dilim kalıbı, beş alanı tek adımda adlandırır:

fn kayittan(s: &str) -> Option<Yazi> {
    let alanlar: Vec<&str> = s.split('|').collect();
    let [id, konu, yazar, etiket, yayinda] = alanlar[..] else {
        return None;
    };
    Some(Yazi {
        id: id.parse().ok()?,
        konu: konu.to_string(),
        yazar: yazar.to_string(),
        etiketler: etiket.split(',').map(String::from).collect(),
        yayinda: yayinda.parse().ok()?,
    })
}

Uygulama Kayıtları oku

Yukarıdaki kayittan fonksiyonunu yaz. Üç satırlık veriyi (ikisi geçerli, üçüncüsü 3|bozuk kayıt) lines() ve filter_map ile oku; 2 kayıt: konu1, konu2 biçiminde yazdır.

Başlangıç kodu

main.rs
#[derive(Debug, Clone)]
struct Yazi {
    id: u32,
    konu: String,
    yazar: String,
    etiketler: Vec<String>,
    yayinda: bool,
}

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
#[derive(Debug, Clone)]
struct Yazi {
    id: u32,
    konu: String,
    yazar: String,
    etiketler: Vec<String>,
    yayinda: bool,
}

fn kayittan(s: &str) -> Option<Yazi> {
    let alanlar: Vec<&str> = s.split('|').collect();
    let [id, konu, yazar, etiket, yayinda] = alanlar[..] else {
        return None;
    };
    Some(Yazi {
        id: id.parse().ok()?,
        konu: konu.to_string(),
        yazar: yazar.to_string(),
        etiketler: etiket.split(',').map(String::from).collect(),
        yayinda: yayinda.parse().ok()?,
    })
}

fn main() {
    let veri = "1|Rust ile başlangıç|ece|rust,giriş|true\n2|Sahiplik|can|rust|false\n3|bozuk kayıt";
    let yazilar: Vec<Yazi> = veri.lines().filter_map(kayittan).collect();
    let konular: Vec<&str> = yazilar.iter().map(|y| y.konu.as_str()).collect();
    println!("{} kayıt: {}", yazilar.len(), konular.join(", "));
}

Beklenen çıktı

2 kayıt: Rust ile başlangıç, Sahiplik

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bozuk bir kaydı sessizce atlamanın riski nedir?

  • Program yavaşlar
  • Derleme hatası
  • Risk yoktur
  • Veri kaybı fark edilmez; en azından sayı raporlanmalı Doğru cevap

Açıklama: Bu derste bozukları atlıyoruz; bir sonraki derste her hatayı numarasıyla raporlayacağız.

2 Geçerlileri topla

Soru
let yazilar: Vec<Yazi> = veri.lines().____(kayittan).collect();
Cevap
let yazilar: Vec<Yazi> = veri.lines().filter_map(kayittan).collect();

Açıklama: filter_map, None dönenleri atıp Some içindekileri toplar.

3 Kayıt ve sonuç

Kavram Anlamı
1|Rust|ece|rust|true Some(Yazi)
3|bozuk kayıt None (alan eksik)
x|a|b|c|true None (id geçersiz)
1|a|b|c|evet None (bool geçersiz)

Orta seviye bölümündeki tüm dersler