Gereksinimler ve Ön Hazırlık
JSON işlemleri için .NET 6 ve üzeri sürümlerde yerleşik olarak gelen System.Text.Json kütüphanesini kullanacağız. Bu kütüphane, eski Newtonsoft.Json kütüphanesine göre daha yüksek performans ve daha düşük bellek tüketimi sunmaktadır.
- .NET 8 veya .NET 9 SDK yüklü olmalıdır.
- Visual Studio 2022 veya VS Code editörü.
- C# 12 veya 13 sözdizimi bilgisi.
Projenizde herhangi bir harici paket yüklemeden, doğrudan using System.Text.Json; direktifini kullanarak işlemlere başlayabilirsiniz.
Adım Adım JSON Verisini C# Nesnesine Dönüştürme
Bir JSON dizisini veya nesnesini C# sınıfına dönüştürmek için JsonSerializer.Deserialize metodu kullanılır. İlk olarak, JSON verinizin yapısına uygun bir sınıf modeli oluşturmalısınız.
// JSON verimiz
string jsonVerisi = "{\"Ad\": \"Ahmet\", \"Yas\": 30, \"Aktif\": true}";
// Hedef sınıfımız
public class Kullanici {
public string Ad { get; set; }
public int Yas { get; set; }
public bool Aktif { get; set; }
}
// Dönüştürme işlemi
Kullanici kullanici = JsonSerializer.Deserialize(jsonVerisi);
Console.WriteLine($"Kullanıcı Adı: {kullanici.Ad}");
Bu örnekte, bir string içindeki JSON verisi, Kullanici sınıfına eşlenmiştir. Özellik isimlerinin JSON anahtarları ile birebir aynı olması (veya [JsonPropertyName] niteliği ile belirtilmesi) önemlidir.
C# Nesnesini JSON Formatına Çevirme
Dinamik olarak oluşturduğunuz bir C# nesnesini API'ye göndermek veya bir dosyaya kaydetmek için JsonSerializer.Serialize metodunu kullanırız. Bu işlem, nesnenin tüm özelliklerini JSON string formatına dönüştürür.
var yeniKullanici = new Kullanici { Ad = "Ayşe", Yas = 25, Aktif = true };
// Nesneyi JSON stringine çevir
string jsonCiktisi = JsonSerializer.Serialize(yeniKullanici);
Console.WriteLine(jsonCiktisi);
Serialize işlemi sırasında verinin daha okunabilir olması için JsonSerializerOptions kullanarak "WriteIndented" özelliğini aktif edebilirsiniz. Bu, JSON çıktısını daha düzenli hale getirir.
JSON Verisi İçerisinde Gezinme ve Seçici Ayrıştırma
Bazen tüm JSON yapısını bir sınıfa eşlemek istemeyebilirsiniz. Özellikle büyük ve karmaşık JSON dosyalarında, sadece belirli bir alana erişmek için JsonDocument sınıfı kullanılır. Bu, yüksek performanslı ve "read-only" (salt okunur) bir yöntemdir.
string json = "{\"Proje\": \"E-Ticaret\", \"Versiyon\": 1.2}";
using (JsonDocument doc = JsonDocument.Parse(json)) {
JsonElement root = doc.RootElement;
string projeAdi = root.GetProperty("Proje").GetString();
Console.WriteLine($"Proje Adı: {projeAdi}");
}
JsonDocument kullanımı, veriyi belleğe tamamen yüklemeden hızlıca okumanıza yardımcı olur. Büyük veri setleri ile çalışırken bellek yönetimi için en verimli yoldur.
JSON İşleme Yöntemleri Karşılaştırması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| JsonSerializer | Kolay kullanım, nesne eşleme | Küçük performans maliyeti |
| JsonDocument | Çok yüksek hız, düşük bellek | Daha karmaşık sözdizimi |
| Utf8JsonReader | Maksimum performans | Düşük seviyeli, zor kodlama |
Güvenlik Uyarıları ve Hata Yönetimi
Kritik Uyarı: Dışarıdan gelen (kullanıcı girişi veya API yanıtı) JSON verilerini doğrudan deserialize etmeden önce mutlaka doğrulayın. Kötü niyetli hazırlanmış büyük JSON dosyaları, uygulamanızda "Denial of Service" (DoS) saldırılarına veya aşırı bellek tüketimine yol açabilir. Ayrıca, hassas verileri (şifre, kimlik no) JSON çıktısı olarak loglamaktan kaçının.
JSON işlemleri sırasında en sık karşılaşılan hata JsonException hatasıdır. Bu hata, JSON formatının bozuk olduğu veya sınıf yapınız ile JSON anahtarlarının uyuşmadığı durumlarda fırlatılır. Her zaman try-catch blokları kullanarak bu hataları yönetin.
try {
var veri = JsonSerializer.Deserialize(hataliJson);
} catch (JsonException ex) {
Console.WriteLine($"JSON ayrıştırma hatası: {ex.Message}");
}
Sıkça Sorulan Sorular
JSON anahtar isimleri ile C# özellik isimleri farklıysa ne yapmalıyım?
System.Text.Json.Serialization altındaki [JsonPropertyName("anahtar_adi")] niteliğini kullanarak, C# sınıfınızdaki özelliğin hangi JSON anahtarına karşılık geleceğini belirtebilirsiniz.
JSON verisi içerisindeki tarih formatlarını nasıl yönetirim?
Varsayılan olarak ISO 8601 formatı kullanılır. Özel bir tarih formatı için JsonConverter sınıfından türetilen bir dönüştürücü yazmanız gerekebilir.
Null değerler JSON çıktısında nasıl gösterilir?
Varsayılan olarak null değerler JSON çıktısına dahil edilir. Bunu değiştirmek için JsonSerializerOptions içerisindeki DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull ayarını kullanabilirsiniz.
Büyük JSON dosyalarını belleği yormadan nasıl işlerim?
Büyük dosyalar için JsonSerializer.DeserializeAsync metodunu ve Stream yapılarını kullanarak veriyi parça parça okuyabilirsiniz.
System.Text.Json ile Newtonsoft.Json arasındaki fark nedir?
System.Text.Json, .NET platformu ile tam entegre, daha hızlı ve güvenli bir kütüphanedir. Newtonsoft.Json ise daha geniş bir özellik setine sahiptir ancak daha fazla bellek tüketir.
JSON Veri İşleme Süreçlerinde Performans Optimizasyonu
Büyük ölçekli veri setleri ile çalışırken, JSON verilerini işleme biçiminiz uygulamanızın bellek (RAM) tüketimini ve CPU kullanımını doğrudan etkiler. Özellikle yüksek trafikli API uç noktalarında, gereksiz nesne oluşturma işlemlerinden kaçınmak hayati önem taşır.
Stream Tabanlı İşleme Yöntemi
Bellek dostu bir yaklaşım için JsonDocument yerine Utf8JsonReader kullanmak, veriyi belleğe yüklemeden "akış" (stream) şeklinde okumanıza olanak tanır. Bu yöntem, özellikle gigabaytlar seviyesindeki JSON dosyalarını işlerken uygulamanızın çökmesini engeller.
using System.Text.Json;
using System.IO;
public void ProcessLargeJson(Stream jsonStream)
{
var readerOptions = new JsonReaderOptions { AllowTrailingCommas = true };
using (var reader = new Utf8JsonReader(File.ReadAllBytes("large_data.json"), readerOptions))
{
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.PropertyName && reader.GetString() == "id")
{
reader.Read();
Console.WriteLine($"ID Değeri: {reader.GetInt32()}");
}
}
}
}
JSON API Yanıtlarında Hata Ayıklama ve Loglama Stratejileri
JSON verilerini ayrıştırırken karşılaşılan en yaygın sorunlar; beklenmedik veri tipleri, eksik alanlar veya hatalı formatlanmış JSON bloklarıdır. Üretim ortamında bu hataları izlenebilir kılmak için özel bir JsonConverter veya hata yakalama mekanizması kurmalısınız.
Özel Hata Yakalama (Exception Handling)
Standart hata mesajları genellikle hatanın hangi satırda olduğunu belirtmez. JsonException sınıfını kullanarak, hatanın kaynağını daha detaylı loglayabilirsiniz:
try
{
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
var data = JsonSerializer.Deserialize(jsonString, options);
}
catch (JsonException ex)
{
// Hatanın konumunu ve detayını loglama
Console.WriteLine($"JSON Ayrıştırma Hatası: {ex.Message}");
Console.WriteLine($"Hata Satırı: {ex.LineNumber}, Pozisyon: {ex.BytePositionInLine}");
}
Performans İpuçları Tablosu
| Yöntem | Kullanım Senaryosu | Performans |
|---|---|---|
| JsonSerializer.Deserialize | Küçük ve orta ölçekli nesneler | Yüksek |
| JsonDocument | Dinamik, şeması belirsiz veriler | Orta |
| Utf8JsonReader | Çok büyük dosyalar (Streaming) | Çok Yüksek |
İpucu: Uygulamanızda sürekli aynı JSON şemalarını kullanıyorsanız, JsonSerializerOptions nesnesini statik bir alanda tanımlayarak yeniden kullanılabilir hale getirin. Bu, her çağrıda yeni bir seçenek nesnesi oluşturulmasının önüne geçerek performansı %15-20 oranında artıracaktır.
Sonuç
C# ile JSON veri işleme ve ayrıştırma, modern yazılım geliştirme süreçlerinin temel taşlarından biridir. System.Text.Json kütüphanesi, sunduğu performans ve güvenlik özellikleri ile 2026 yılı projeleriniz için en doğru tercihtir. Bu rehberde öğrendiğiniz yöntemleri, küçük projelerden başlayarak büyük ölçekli kurumsal uygulamalarınıza entegre edebilirsiniz.
Bir sonraki adım olarak, JSON verilerini veritabanı modelleriyle nasıl eşleştireceğinizi ve API katmanlarında JSON yanıtlarını nasıl standartlaştıracağınızı araştırmanızı öneririm. Yazılım dünyasında sürekli öğrenme, başarının anahtarıdır.
Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamındaki uygulamalarınızda veri girişi doğrulaması (input validation) ve güvenlik protokollerini (OWASP standartları vb.) mutlaka uygulayınız.


Yorumlar (0)
Yorum Yaz