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

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

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

ابدأ الدورة

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



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



1. تثبيت وتضمين serde_json



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



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


serde يوفر السمات (traits) Serialize و Deserialize، بينما serde_json يوفر التنفيذ المحدد لـ JSON. بعد إضافة الكريتات، يمكن استيرادها في الكود:



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


2. تسلسل الهياكل (Structs) إلى JSON



لتحويل هيكل Rust إلى JSON، يجب إضافة تعليق توضيحي له بسمات #[derive(Serialize)]. لنلق نظرة على مثال مع بيانات المستخدم:



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

fn main() -> Result<()> { let user = User { name: "أليكسي".to_string(), age: 30, email: "alex@example.com".to_string(), active: true, };

let json = serde_json::to_string(&user)?; println!("{}", json); // الإخراج: {"name":"أليكسي","age":30,"email":"alex@example.com","active":true} Ok(())}


الطريقة serde_json::to_string تُرجع Result<String>. للإخراج المنسق، استخدم serde_json::to_string_pretty.



3. إلغاء تسلسل JSON إلى هياكل



العملية العكسية - تحويل سلسلة JSON إلى هيكل Rust. للقيام بذلك، يجب أن ينفذ الهيكل Deserialize:



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

fn main() -> Result<()> { let data = r#" { "name": "ماريا", "age": 25, "email": "maria@example.com", "active": false }"#;

let user: User = serde_json::from_str(data)?; println!("{:?}", user); // الإخراج: User { name: "ماريا", age: 25, email: "maria@example.com", active: false } Ok(())}


إذا كان JSON يحتوي على حقول غير موجودة في الهيكل، أو العكس، استخدم السمات #[serde(default)] أو #[serde(skip_serializing_if = "Option::is_none")].



4. العمل مع JSON التعسفي (Value)



أحيانًا يكون هيكل البيانات غير معروف مسبقًا. في هذه الحالات، يتم استخدام التعداد serde_json::Value، والذي يمكنه تمثيل أي نوع JSON:



use serde_json::Value;

fn main() -> Result<()> { let data = r#" { "name": "إيفان", "age": 35, "hobbies": ["قراءة", "برمجة"], "address": null }"#;

let v: Value = serde_json::from_str(data)?;

// الوصول إلى الحقول if let Some(name) = v.get("name") { println!("الاسم: {}", name); }

// استخراج مصفوفة if let Some(hobbies) = v.get("hobbies").and_then(|h| h.as_array()) { for hobby in hobbies { println!("الهواية: {}", hobby); } }

Ok(())}


Value يدعم الطرق as_str() و as_u64() و as_array() وغيرها لاستخراج البيانات بشكل آمن.

توصيات