CodeBlanks Logo Icon CodeBlanks

JSON

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]);   // 2

r#"..."# 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

main.rs
use std::collections::BTreeMap;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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::&lt;Kitap&gt;(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

Soru
let geri: Kitap = serde_json::____(&metin)?;
Cevap
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

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