Mehmet

WFN Üye
Konular
1,095
Mesajlar
1,096
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
İlk paragrafta ana yanıtı, izlenecek yolu ve ulaşılabilecek sonucu doğrudan ver. C# uygulamasında JSON dosyası okumak ve yazmak için en pratik yöntem.NET ile birlikte gelen System.Text.Json ad alanındaki JsonSerializer sınıfını kullanmaktır. JSON içeriğini bir C# sınıfına dönüştürmek için Deserialize, sınıfı JSON metnine çevirmek için Serialize çağrılır; ardından File.ReadAllText veya File.WriteAllText ile dosya okunur ya da kaydedilir. Aşağıdaki örnekte dosyadan ayarlar okunacak, bir değer değiştirilecek ve güncel içerik tekrar aynı dosyaya yazılacaktır.

JSON dosyasını okuyup yazmak için temel sınıfı oluşturma​


Önce JSON dosyasındaki alanları temsil eden bir C# sınıfı tanımlayın. Aşağıdaki sınıf, örnek olarak uygulama ayarlarını tutar:

C#:
public class UygulamaAyarlari
{
    public string Dil { get; set; } = "tr-TR";
    public bool KoyuTema { get; set; }
    public int FontBoyutu { get; set; } = 14;
}

Bu sınıfa karşılık gelen ayarlar.json dosyasının başlangıç içeriği şöyle olabilir:

JSON:
{
  "Dil": "tr-TR",
  "KoyuTema": false,
  "FontBoyutu": 14
}

JSON alan adları ile C# özellik adları aynıysa System.Text.Json doğrudan eşleştirme yapar. Alan adları farklıysa JsonPropertyName niteliğiyle eşleştirmeyi açıkça belirtebilirsiniz.

JSON dosyasını okuma​


Dosyayı okumak için önce metni alın, ardından bu metni UygulamaAyarlari nesnesine dönüştürün:

C#:
using System;
using System.IO;
using System.Text.Json;

string dosyaYolu = "ayarlar.json";

if (!File.Exists(dosyaYolu))
{
    Console.WriteLine("JSON dosyası bulunamadı.");
    return;
}

string jsonMetni = File.ReadAllText(dosyaYolu);
UygulamaAyarlari? ayarlar = JsonSerializer.Deserialize<UygulamaAyarlari>(jsonMetni);

if (ayarlar is null)
{
    Console.WriteLine("JSON içeriği ayar nesnesine dönüştürülemedi.");
    return;
}

Console.WriteLine($"Dil: {ayarlar.Dil}");
Console.WriteLine($"Koyu tema: {ayarlar.KoyuTema}");
Console.WriteLine($"Yazı boyutu: {ayarlar.FontBoyutu}");

File.Exists sonucu false ise dosya yolu yanlıştır veya dosya henüz oluşturulmamıştır. Göreli yol kullandığınızda dosya, uygulamanın çalışma dizininde aranır; bu nedenle dosyayı kaynak kodunun bulunduğu klasörde aramak yerine programın çalışma dizinini kontrol etmeniz gerekebilir.

Dosya mevcut olmasına rağmen JsonSerializer.Deserialize çağrısında hata oluşuyorsa içerik geçerli JSON olmayabilir. Eksik virgül, kapanmamış süslü parantez veya veri türü uyuşmazlığı sık görülen nedenlerdir. Örneğin FontBoyutu sayısal bir özellik olduğu için JSON içinde metin olarak verilen "14" değeri bazı senaryolarda dönüştürme hatasına yol açabilir.

JSON dosyasını yazma​


Bir C# nesnesini JSON metnine çevirmek için JsonSerializer.Serialize kullanılır. WriteIndented = true seçeneği, dosyanın satır ve girintilerle okunabilir biçimde yazılmasını sağlar.

C#:
using System;
using System.IO;
using System.Text.Json;

string dosyaYolu = "ayarlar.json";

var ayarlar = new UygulamaAyarlari
{
    Dil = "tr-TR",
    KoyuTema = true,
    FontBoyutu = 16
};

var jsonSecenekleri = new JsonSerializerOptions
{
    WriteIndented = true
};

string jsonMetni = JsonSerializer.Serialize(ayarlar, jsonSecenekleri);
File.WriteAllText(dosyaYolu, jsonMetni);

Console.WriteLine($"Ayarlar kaydedildi: {dosyaYolu}");

Bu kod çalıştırıldığında ayarlar.json içeriği yeni değerlerle güncellenir:

JSON:
{
  "Dil": "tr-TR",
  "KoyuTema": true,
  "FontBoyutu": 16
}

File.WriteAllText mevcut dosyanın içeriğini yenisiyle değiştirir. Eski içeriği korumak istiyorsanız yazma işleminden önce yedek dosya oluşturmalı veya yeni içeriği farklı bir dosya adına kaydetmelisiniz.

Okuma, değiştirme ve yazmayı tek akışta kullanma​


Gerçek bir uygulamada genellikle dosya okunur, nesne üzerinde değişiklik yapılır ve aynı nesne tekrar JSON olarak kaydedilir:

C#:
using System;
using System.IO;
using System.Text.Json;

public class UygulamaAyarlari
{
    public string Dil { get; set; } = "tr-TR";
    public bool KoyuTema { get; set; }
    public int FontBoyutu { get; set; } = 14;
}

string dosyaYolu = "ayarlar.json";
var jsonSecenekleri = new JsonSerializerOptions
{
    WriteIndented = true
};

UygulamaAyarlari ayarlar;

if (File.Exists(dosyaYolu))
{
    string mevcutJson = File.ReadAllText(dosyaYolu);
    ayarlar = JsonSerializer.Deserialize<UygulamaAyarlari>(mevcutJson)
              ?? new UygulamaAyarlari();
}
else
{
    ayarlar = new UygulamaAyarlari();
}

ayarlar.KoyuTema = !ayarlar.KoyuTema;
ayarlar.FontBoyutu = 16;

string yeniJson = JsonSerializer.Serialize(ayarlar, jsonSecenekleri);
File.WriteAllText(dosyaYolu, yeniJson);

Console.WriteLine("Ayarlar güncellendi.");

Dosya yoksa varsayılan ayarlar oluşturulur; dosya varsa mevcut değerler okunur. Ardından koyu tema değeri tersine çevrilir ve yazı boyutu 16 yapılır. Programı tekrar çalıştırdığınızda dosyadaki önceki değer okunacağı için değişiklik akışın bir sonraki çalıştırmasına da yansır.

Dosya yolu ve JSON hatalarını ayırma​


JSON işlemlerinde hatanın kaynağını doğru ayırmak, sorunu çözmek için önemlidir:
DurumAnlamıYapılacak işlem
Dosya bulunamadıDosya yolu yanlış olabilir veya dosya henüz oluşturulmamıştır.Çalışma dizinini ve dosya adını kontrol edin; gerekiyorsa varsayılan dosyayı oluşturun.
JsonExceptionJSON sözdizimi veya veri türü beklenen yapıyla uyuşmuyor olabilir.Hata mesajındaki satır ve konumu inceleyip ilgili JSON alanını düzeltin.
Null sonuçJSON içeriği beklenen nesneye dönüştürülememiştir.Boş dosya, null değeri veya yanlış JSON yapısı olup olmadığını kontrol edin.
Erişim hatasıUygulamanın dosyayı okuma ya da yazma izni olmayabilir veya dosya başka işlem tarafından kullanılıyor olabilir.Klasör iznini, dosyanın kullanım durumunu ve hedef yolu kontrol edin.
Dosya kullanıcının değiştirebildiği bir konumdaysa JsonSerializer.Deserialize çağrısını try-catch içinde çalıştırmak uygulamanın bozuk JSON nedeniyle kapanmasını önler:

C#:
try
{
    string jsonMetni = File.ReadAllText("ayarlar.json");
    UygulamaAyarlari? ayarlar = JsonSerializer.Deserialize<UygulamaAyarlari>(jsonMetni);
}
catch (JsonException hata)
{
    Console.WriteLine($"JSON biçimi geçersiz: {hata.Message}");
}
catch (IOException hata)
{
    Console.WriteLine($"Dosya okunamadı: {hata.Message}");
}

Hata mesajını kullanıcıya gösterirken dosyanın tamamını veya JSON içinde bulunabilecek parola, erişim anahtarı ve kişisel verileri ekrana basmayın. Tanılama amacıyla geçici kayıt alıyorsanız iş tamamlandıktan sonra hassas içerikleri loglardan kaldırın.

Büyük dosyalarda eş zamanlı kullanım​


Küçük ayar dosyalarında File.ReadAllText ve File.WriteAllText yeterlidir. Masaüstü uygulamasında arayüzün donmaması veya dosyanın büyük olması önemliyse eş zamanlı yöntemleri kullanabilirsiniz:

C#:
using System.IO;
using System.Text.Json;

string jsonMetni = await File.ReadAllTextAsync("ayarlar.json");
UygulamaAyarlari? ayarlar = JsonSerializer.Deserialize<UygulamaAyarlari>(jsonMetni);

ayarlar ??= new UygulamaAyarlari();
ayarlar.KoyuTema = true;

string yeniJson = JsonSerializer.Serialize(ayarlar, new JsonSerializerOptions
{
    WriteIndented = true
});

await File.WriteAllTextAsync("ayarlar.json", yeniJson);

Bu yöntem dosya işlemi sürerken çağıran iş parçacığının beklemesini azaltır; ancak aynı JSON dosyasına birden fazla işlem aynı anda yazıyorsa son yazan işlem önceki değişikliği ezebilir. Böyle bir durumda dosya erişimini kilitlemek, geçici dosyaya yazıp ardından değiştirmek veya uygulamanın veri saklama yaklaşımını yeniden düzenlemek gerekir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic