معالجة JSON في Rust: مكتبة serde_json لموقع تعليمي

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

معالجة JSON في Rust: دليل كامل مع serde_json



JSON (JavaScript Object Notation) هو أحد أكثر تنسيقات تبادل البيانات شيوعًا في تطوير الويب. في Rust، تتم معالجة JSON باستخدام المكتبة القوية serde_json، والتي تعد جزءًا من النظام البيئي Serde - إطار عمل لتسلسل وإلغاء تسلسل هياكل البيانات. في هذه المقالة، سنشرح بالتفصيل كيفية العمل مع JSON في Rust: من التثبيت إلى الأمثلة المعقدة مع الهياكل المتداخلة.



التثبيت والإعداد



للبدء، أضف التبعيات إلى ملف Cargo.toml:



[dependencies]serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"


توفر مكتبة serde وحدات الماكرو #[derive(Serialize, Deserialize)]، بينما تتولى serde_json تحويل البيانات إلى JSON والعكس.



التسلسل وإلغاء التسلسل الأساسي



لننظر إلى مثال بسيط: سننشئ هيكل User ونتعلم كيفية تحويله إلى JSON والعكس.



use serde::{Serialize, Deserialize};use serde_json;

#[derive(Debug, Serialize, Deserialize)]struct User { name: String, age: u8, email: String,}

fn main() { // إنشاء مثيل للهيكل let user = User { name: "أليكسي".to_string(), age: 30, email: "alex@example.com".to_string(), };

// التسلسل إلى سلسلة JSON let json_string = serde_json::to_string(&user).unwrap(); println!("JSON: {}", json_string);

// إلغاء التسلسل من JSON إلى الهيكل let deserialized_user: User = serde_json::from_str(&json_string).unwrap(); println!("تم إلغاء التسلسل: {:?}", deserialized_user);}


نتيجة التنفيذ:

JSON: {"name":"أليكسي","age":30,"email":"alex@example.com"}تم إلغاء التسلسل: User { name: "أليكسي", age: 30, email: "alex@example.com" }


العمل مع الهياكل المتداخلة



غالبًا ما يحتوي JSON على كائنات ومصفوفات متداخلة. يتيح Rust نمذجة هذه الهياكل بسهولة:



#[derive(Debug, Serialize, Deserialize)]struct Address {    city: String,    street: String,    house: u16,}

#[derive(Debug, Serialize, Deserialize)]struct Person { name: String, age: u8, address: Address, hobbies: Vec<String>,}

fn main() { let person = Person { name: "ماريا".to_string(), age: 25, address: Address { city: "موسكو".to_string(), street: "تفرسكايا".to_string(), house: 10, }, hobbies: vec!["قراءة".to_string(), "رياضة".to_string()], };

// إخراج JSON جميل مع مسافات بادئة let pretty_json = serde_json::to_string_pretty(&person).unwrap(); println!("{}", pretty_json);}


الإخراج:

{  "name": "ماريا",  "age": 25,  "address": {    "city": "موسكو",    "street": "تفرسكايا",    "house": 10  },  "hobbies": [    "قراءة",    "رياضة"  ]}


معالجة الأخطاء والحقول الاختيارية



في المشاريع الحقيقية، قد تكون البيانات غير مكتملة. يقدم Rust طرقًا أنيقة للتعامل مع هذه المواقف:



  • Option<T> - للحقول الاختيارية
  • Result<T, E> - لمعالجة أخطاء التحليل
  • سمات Serde - لتخصيص سلوك التسلسل


use serde::{Serialize, Deserialize};use serde_json::Result;

#[derive(Debug, Serialize, Deserialize)]struct Product { name: String, price: f64, #[serde(default)] // قيمة افتراضية إذا كان الحقل مفقودًا description: Option<String>, #[serde(skip_serializing_if = "Option::is_none")] // تخطي إذا كان None discount:

توصيات