- Konu sahibi
- #1
İ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
Ö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:
Bu sınıfa karşılık gelen
JSON alan adları ile C# özellik adları aynıysa
Dosyayı okumak için önce metni alın, ardından bu metni
Dosya mevcut olmasına rağmen
Bir C# nesnesini JSON metnine çevirmek için
Bu kod çalıştırıldığında
Gerçek bir uygulamada genellikle dosya okunur, nesne üzerinde değişiklik yapılır ve aynı nesne tekrar JSON olarak kaydedilir:
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.
JSON işlemlerinde hatanın kaynağını doğru ayırmak, sorunu çözmek için önemlidir:
Dosya kullanıcının değiştirebildiği bir konumdaysa
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.
Küçük ayar dosyalarında
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.
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:
| Durum | Anlamı | 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. |
| JsonException | JSON 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. |
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.