مقدمة: لماذا JSON مهم في Rust؟
\n\nJSON (JavaScript Object Notation) لا يزال أحد أكثر التنسيقات شيوعًا لتبادل البيانات بين الخدمات وملفات التهيئة وAPI. في نظام Rust البيئي، يتم العمل مع JSON من خلال المكتبة القوية serde_json، والتي بالاقتران مع إطار العمل serde توفر طريقة أنيقة وآمنة لتحويل هياكل البيانات.
على عكس اللغات الديناميكية، تتطلب Rust وصفًا صريحًا للأنواع، وهو ما قد يبدو معقدًا للوهلة الأولى. لكن في الممارسة العملية، يوفر هذا موثوقية لا تصدق: لن تحصل أبدًا على قيمة null غير متوقعة أو حقل بنوع خاطئ أثناء التنفيذ. في هذه المقالة، سنشرح تحليل (إلغاء التسلسل) وتسلسل JSON من خلال أمثلة محددة يمكن تطبيقها فورًا في المشاريع الحقيقية.
1. إعداد المشروع وتثبيت التبعيات
\n\nقبل كتابة الكود، سنضيف المكتبات اللازمة إلى Cargo.toml:
[dependencies]\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\n\nمكتبة serde مع الخاصية derive تسمح بتوليد الكود تلقائيًا للتسلسل وإلغاء التسلسل لهياكلنا. serde_json مسؤولة مباشرة عن التحويل من/إلى JSON.
نستورد كل ما هو ضروري في main.rs:
use serde::{Deserialize, Serialize};\nuse serde_json::Result;\n\n2. التسلسل: تحويل هيكل Rust إلى JSON
\n\nالتسلسل هو عملية تحويل كائن Rust إلى سلسلة JSON. لنأخذ مثالًا كلاسيكيًا مع بيانات مستخدم.
\n\nإعلان الهيكل
\n\nنضيف التعليقات التوضيحية #[derive(Serialize, Deserialize)] إلى هيكلنا:
#[derive(Debug, Serialize, Deserialize)]\nstruct User {\n id: u32,\n name: String,\n email: String,\n is_active: bool,\n tags: Vec<String>,\n}\n\nإنشاء مثيل وتسلسله
\n\nالآن سننشئ كائنًا ونحوله إلى JSON:
\n\nfn main() -> Result<()> {\n let user = User {\n id: 42,\n name: "أليكسي".to_string(),\n email: "alex@example.com".to_string(),\n is_active: true,\n tags: vec!["rust".to_string(), "backend".to_string()],\n };\n\n // التسلسل إلى سلسلة JSON\n let json_string = serde_json::to_string(&user)?;\n println!("{}", json_string);\n\n // تسلسل جميل (pretty)\n let pretty_json = serde_json::to_string_pretty(&user)?;\n println!("{}", pretty_json);\n\n Ok(())\n}\n\nنتيجة التنفيذ:
\n\n{"id":42,"name":"أليكسي","email":"alex@example.com","is_active":true,"tags":["rust","backend"]}\n\n{\n "id": 42,\n "name": "أليكسي",\n "email": "alex@example.com",\n "is_active": true,\n "tags": [\n "rust",\n "backend"\n ]\n}\n\nلاحظ: to_string_pretty يضيف مسافات بادئة وفواصل أسطر - مثالي لملفات التهيئة أو السجلات.
3. التحليل (إلغاء التسلسل): من JSON إلى هيكل Rust
\n\nإلغاء التسلسل هو العملية العكسية: نحصل على سلسلة JSON ونحولها إلى هيكل Rust محدد النوع.
\n\nالتحليل من سلسلة
\n\nfn parse_user_from_json(json_str: &str) -> Result<User> {\n let user: User = serde_json::from_str(json_str)?;\n Ok(user)\n}\n\nfn main() -> Result<()> {\n let data = r#"\n {\n "id": 101,\n "name": "ماريا",\n "email": "maria@example.com",\n "is_active": false,\n "tags": ["python", "data-science"]\n }\n "#;\n\n let user = parse_user_from_json(data)?;\n println!("المستخدم: {:?}", user);\n println!("الاسم: {}", user.name);\n println!("نشط: {}", user.is_active);\n\n Ok(())\n}\n\nإذا كان JSON لا يتوافق مع الهيكل (مث