مقدمة في العمل مع JSON في C#
\n\nJSON (JavaScript Object Notation) هو تنسيق خفيف لتبادل البيانات يُستخدم على نطاق واسع في تطوير الويب وتطبيقات الهاتف المحمول والخدمات المصغرة. بالنسبة لمطور C#، فإن القدرة على العمل مع JSON هي مهارة أساسية. في هذه المقالة، سنشرح أساسيات تحليل (إلغاء التسلسل) وتسلسل JSON باستخدام مساحة الأسماء الحديثة System.Text.Json، المضمنة في .NET Core 3.0 والإصدارات الأحدث، بالإضافة إلى .NET 5/6/7/8.
سنغطي:
\n- \n
- ما هو التسلسل وإلغاء التسلسل \n
- كيفية تحويل كائن C# إلى سلسلة JSON \n
- كيفية قراءة JSON وتحويله مرة أخرى إلى كائن \n
- العمل مع الكائنات المتداخلة والمجموعات \n
- معالجة الأخطاء وتكوين التسلسل \n
جميع أمثلة الكود مكتوبة لتطبيق وحدة تحكم C# (.NET 6+). يمكنك نسخها وتشغيلها فورًا.
\n\n1. أساسيات التسلسل: كائن → JSON
\n\nالتسلسل هو عملية تحويل كائن (أو بنية بيانات) إلى سلسلة بتنسيق JSON. في C#، يتم استخدام الفئة JsonSerializer من مساحة الأسماء System.Text.Json.
إنشاء نموذج بسيط
\n\nلنفترض أن لدينا الفئة Person:
public class Person\n{\n public string Name { get; set; }\n public int Age { get; set; }\n public string Email { get; set; }\n}\n\nتسلسل الكائن
\n\nالآن سننشئ مثيلًا ونحوله إلى JSON:
\n\nusing System.Text.Json;\n\nPerson person = new Person\n{\n Name = "إيفان بيتروف",\n Age = 30,\n Email = "ivan@example.com"\n};\n\nstring jsonString = JsonSerializer.Serialize(person);\nConsole.WriteLine(jsonString);\n\nالنتيجة:
\n\n{"Name":"إيفان بيتروف","Age":30,"Email":"ivan@example.com"}\n\nبشكل افتراضي، يستخدم JsonSerializer تنسيق camelCase لأسماء الخصائص (الحرف الأول صغير)، ولكن في مثالنا بقيت الأسماء بحرف كبير لأننا لم نغير الإعدادات. إذا كنت بحاجة إلى camelCase صارم، استخدم JsonSerializerOptions:
var options = new JsonSerializerOptions\n{\n PropertyNamingPolicy = JsonNamingPolicy.CamelCase\n};\nstring jsonCamelCase = JsonSerializer.Serialize(person, options);\nConsole.WriteLine(jsonCamelCase);\n// {"name":"إيفان بيتروف","age":30,"email":"ivan@example.com"}\n\n2. إلغاء التسلسل: JSON → كائن
\n\nإلغاء التسلسل هو العملية العكسية: نأخذ سلسلة JSON ونحولها إلى كائن C#.
\n\nمثال بسيط على إلغاء التسلسل
\n\nلنفترض أننا تلقينا JSON من API:
\n\nstring jsonFromApi = @"{""Name"":""آنا سميرنوفا"",""Age"":25,""Email"":""anna@test.com""}";\n\nPerson? personFromJson = JsonSerializer.Deserialize<Person>(jsonFromApi);\n\nif (personFromJson != null)\n{\n Console.WriteLine($"الاسم: {personFromJson.Name}, العمر: {personFromJson.Age}");\n}\n\nلاحظ علامة ? بعد النوع Person — وهي تعليق توضيحي للقيم القابلة للعدم (nullable) يشير إلى أن النتيجة قد تكون null (على سبيل المثال، إذا كان JSON غير صحيح).
العمل مع المصفوفات والقوائم
\n\nغالبًا ما يحتوي JSON على مجموعات من الكائنات. لنفترض أن لدينا مصفوفة من المستخدمين:
\n\nstring jsonArray = @"\n[\n {""Name"":""أوليغ"",""Age"":35},\n {""Name"":""ماريا"",""Age"":28},\n {""Name"":""دميتري"",""Age"":42}\n]";\n\nList<Person>? people = JsonSerializer.Deserialize<List<Person>>(jsonArray);\n\nif (people != null)\n{\n foreach (var p in people)\n {\n Console.WriteLine($"{p.Name} - {p.Age} سنة");\n }\n}\n\n3. العمل مع الكائنات المتداخلة والهياكل المعقدة
\n\nنادرًا ما تكون بيانات JSON الحقيقية مسطحة. سننظر في