1. Giriş
Biz artıq kolleksiyalarla işləməyi öyrənmişik. Proqramlaşdırmada və həyatda onlar olmadan elə də rahat deyil. Təsəvvür edin ki, gün üçün etməli işlərin siyahısını hazırlayırsız: ərzaq almaq, həkimə zəng etmək, sifarişi götürmək. Hər iş üçün ayrıca dəftər açmaq əvəzinə, hamısını bir siyahıda qeyd etmək daha rahat və məntiqlidir.
Eyni şey proqramlaşdırmada da keçərlidir: obyektlər çox olduqda — istifadəçilər, sifarişlər, mesajlar — hər biri üçün ayrıca dəyişən yaratmırıq. Əvəzində kolleksiyalardan istifadə edirik: siyahılar, dictionary-lər, set-lər. Bu, məlumat qruplarını saxlamağı, üzərində dönməyi və emal etməyi asanlaşdırır.
Həyatdan götürülmüş ssenarilər:
- Məlumatların tətbiqlər arasında saxlanması və mübadiləsi: kitab kolleksiyanız bir proqramdan digərinə köçə bilər.
- Məlumat dəstlərinin diskə cache-lənməsi.
- Məlumatların şəbəkə üzərindən ötürülməsi (frontend ↔ backend).
- Məlumatların import/export-u (məsələn, kitablarınızı JSON-a export etmək qərarına gəldiniz!).
Müsahibədə: «Siz sifarişlər siyahısını necə serializasiya edib saxlayardınız?» — əgər kolleksiyaların serializasiyasını da deyə bilsəniz, çox yaxşı təsir bağışlayacaq.
2. Kolleksiyalar serializasiya olunanda necə davranır
JSON və kolleksiyalar: qısa sevgi hekayəsi
Bir obyekt serializasiya olunduqda, o JSON-obyektinə çevrilir: { "field": value }. Amma siyahı və ya massiv serializasiya olunanda nəticə JSON-massivi olacaq: [ ... ].
Vizual olaraq:
| C# | JSON |
|---|---|
|
|
|
|
|
|
Əsas sehr: kolleksiyaya JsonSerializer.Serialize() çağırırsınız — və o avtomatik şəkildə onu massivə çevirir! Əks istiqamətdə isə Deserialize<List<T>>() çağırırsınız — və yenə sihir işə düşür.
C# kolleksiyaları ilə JSON-massivlərinin uyğunluğu
| C# kolleksiya tipi | Nümunə | JSON |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3. Nümunə: kitab massivinin serializasiyası və deserializasiyası
Gəlin minimal nümunədən başlayaq. Keçən mühazirələrdə yazdığımız Book sinifini götürək:
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
}
İndi kitab massivini yaradıb serializasiya edək, fayla yazıb geri yükləyək.
using System;
using System.IO;
using System.Text.Json;
namespace LibraryApp
{
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
}
class Program
{
static void Main()
{
// Kitab massivini yaradacağıq
Book[] books = new Book[]
{
new Book { Title = "Tri tovarishcha", Author = "Erikh Mariya Remark" },
new Book { Title = "Master i Margarita", Author = "Mihail Bulgakov" },
new Book { Title = "1984", Author = "Dzhordzh Oruell" }
};
// Kitab massivinin serializasiyası sətirə
var options = new JsonSerializerOptions { WriteIndented = true };
string json = JsonSerializer.Serialize(books, options);
Console.WriteLine("JSON massivi kitablarn:\n" + json);
// Fayla yazmaq (synchron)
File.WriteAllText("books.json", json);
// Fayldan oxumaq (synchron)
string jsonFromFile = File.ReadAllText("books.json");
// Yenidən massivə deserializasiya
Book[]? booksFromFile = JsonSerializer.Deserialize<Book[]>(jsonFromFile);
// Nəticəni konsola çıxardırıq
Console.WriteLine("\nDeserializasiya olunmus kitaplar:");
if (booksFromFile != null)
{
foreach (var book in booksFromFile)
{
Console.WriteLine($"- {book.Title} (muellif: {book.Author})");
}
}
}
}
}
Burada nə baş verir?
- Biz Book[] massivini yaradıb onu üç kitabla doldururuq.
- JsonSerializer.Serialize vasitəsilə massivi gözəl JSON-sətirinə çeviririk (WriteIndented opsiyası formatı oxunaqlı edir).
- Onu fayla yazırıq, fayldan oxuyub deserializasiya edirik — və yenidən kitablar massivini əldə edirik!
- Bütün məlumatların düzgün bərpa olunduğunu yoxlayırıq.
Yoxlayın ki, "books.json" faylı proqramın qovluğunda yaranır. Onu açın, təxminən belə JSON olacaq:
[
{
"Title": "Tri tovarishcha",
"Author": "Erikh Mariya Remark"
},
{
"Title": "Master i Margarita",
"Author": "Mihail Bulgakov"
},
{
"Title": "1984",
"Author": "Dzhordzh Oruell"
}
]
4. Nümunə: List<T> kolleksiyasının serializasiyası
List<Book> ilə işləmək heç nə ilə fərqlənmir. Serializer kolleksiyanı görür və onu JSON-massivinə çevirir.
List<Book> myBooks = new List<Book>
{
new Book { Title = "Prestuplenie i nakazanie", Author = "Fedor Dostoevskiy" },
new Book { Title = "Voyna i mir", Author = "Lev Tolstoy" }
};
string jsonList = JsonSerializer.Serialize(myBooks, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(jsonList);
// Və deserializasiya belə edilir:
List<Book>? loadedBooks = JsonSerializer.Deserialize<List<Book>>(jsonList);
// Hər şeyin qaydasında olduğunu yoxlayaq!
foreach (var book in loadedBooks!)
{
Console.WriteLine($"{book.Title} ({book.Author})");
}
Yalnız tam ədədlərdən ibarət siyahını serializasiya etmək olar mı?
Əlbəttə! Serializasiya yalnız siniflərə aid deyil, sadə tiplərlə də işləyir:
List<int> numbers = new List<int> { 10, 20, 30, 40 };
string jsonNums = JsonSerializer.Serialize(numbers); // nəticə: [10,20,30,40]
List<int>? loadedNums = JsonSerializer.Deserialize<List<int>>(jsonNums);
// loadedNums: eyni dəyərlərə malik List<int>
5. SXEMA və analogiyalar: serializer kolleksiyaları necə görür?
Kolleksiyaların serializasiyasının necə işlədiyini daha yaxşı anlamaq üçün sadə sxemə baxaq:
graph TD;
A[List[Book] in C#] -->|Serialize| B[JSON-array in string]
B -->|Write| C[File books.json]
C -->|Read| D[JSON string from file]
D -->|Deserialize| E[List[Book] in C#]
Qısa proses təsviri:
- Kolleksiya və ya massiv JSON-da massiv kimi serializasiya olunur ([ ... ]).
- Elementlərin sırası saxlanılır (əgər xüsusi ayarlarla müdaxilə etməmisinizsə).
- Kolleksiyanın hər bir elementi öz obyekti kimi serializasiya olunur.
6. Kolleksiyaların serializasiyasının xüsusiyyətləri: nəyə diqqət etmək lazımdır
1. null və boş kolleksiyalar
Əgər kolleksiya null olarsa, serializer default olaraq JSON-da sadəcə null yazacaq. Biznes-logic-də boş kolleksiya ilə null-ın eyni olmadığını unutmayın!
Əgər kolleksiya boşdursa (new List<Book>()), JSON [] — boş massiv kimi görünəcək. Bu, elementlərin olmamasını açıq göstərmək üçün faydalıdır.
2. Deserializasiya — sıra vacibdir
Massivdə elementlərin sırası həmişə qorunur. Yəni üç kitabı müəyyən sırada serializasiya etmisinizsə, həmin sıra deserializasiya zamanı da qalxacaq.
3. Müxtəlif tiplərdən ibarət kolleksiya?
System.Text.Json polimorfizmi «qutu içində» dəstəkləmir. Məsələn, əgər sizin List<Animal>-ınız itlər və pişiklər kimi törəmə siniflərdən ibarətdirsə, default halda hansı konkret tip olduğunu bərpa etmək mümkün deyil. Polimorfik serializasiyaya sonra toxunacağıq, amma adi siyahılarda hər şey sadədir.
7. Tipik səhvlər və ümumi çaşqınlıqlar
Səhv №1: Kolleksiyanı serializasiya edirik, amma onun içində privat sahələri olan obyektlər ola bilər
JsonSerializer yalnız public properties-ləri (və yalnız getter/setter olanları) serializasiya edir. Məsələn belə bir sinifiniz varsa:
public class User
{
public string Login { get; set; }
private string Password { get; set; } // Serializasiya olunmayacaq!
}
Password JSON-a düşməyəcək və bu təhlükəsizlik üçün yaxşıdır. Amma əgər siz onu saxlamaq istəyirsinizsə — property-ni public etməyi unutmayın.
Səhv №2: Kolleksiyada null elementlər olduğu halda serializasiya
Əgər kolleksiya null elementlərə malikdirsə, məsələn: new List<Book> { null, book2 }, serializasiyada ilk elementin yerində null olacaq. Deserializasiya zamanı da eyni olacaq. Belə JSON nümunəsi:
[null, { "Title": "Voyna i mir", "Author": "Lev Tolstoy" }]
Praktikada nadir olsa da, əgər kolleksiyanızda "dəliklər" ola biləcəyini gözləyirsinizsə — bunu lojiqada nəzərə alın.
Səhv №3: Deserializasiya zamanı yanlış tip
Tez-tez edilən səhv: siyahını serializasiya edirsiniz, amma deserializasiya edərkən onu massiva (və ya əksinə) çevirirsiniz. Bu uyğundur, əgər tiplər uyğun gəlirsə (Book[] ↔ List<Book>), amma bəzən nüanslar ola bilər — məsələn, string massivini obyektə deserializasiya etmək istəsəniz problem yarana bilər.
GO TO FULL VERSION