معالجة JSON في Rust: serde_json، simd-json، json5 ومكتبات أخرى

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

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

ابدأ الدورة

معالجة JSON في Rust: مراجعة المكتبات والأدوات الرئيسية



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



1. serde_json - المعيار الفعلي



serde_json هي المكتبة الرئيسية لتسلسل وإلغاء تسلسل JSON في Rust. وهي مبنية فوق إطار العمل serde، مما يسمح بتحويل هياكل بيانات Rust تلقائيًا إلى JSON والعكس.



التثبيت: أضف إلى Cargo.toml:



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


مثال: التسلسل وإلغاء التسلسل



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

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

fn main() -> Result<()> { let user = User { name: "آنا".to_string(), age: 30, email: Some("anna@example.com".to_string()), };

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

// إلغاء التسلسل مرة أخرى إلى هيكل let deserialized: User = serde_json::from_str(&json_string)?; println!("{:?}", deserialized);

Ok(())}


الإمكانيات:

  • دعم الهياكل المتداخلة، التعدادات والحقول الاختيارية.
  • العمل مع JSON عشوائي عبر serde_json::Value (enum مع خيارات Null، Bool، Number، String، Array، Object).
  • مسلسلات مخصصة عبر السمات #[serde(rename)]، #[serde(skip)] وغيرها.
  • معالجة التدفق (streaming) للملفات الكبيرة.


متى تستخدم: لـ 95% من المشاريع - هذا هو الخيار الأفضل. إنه مستقر، موثق جيدًا ويتكامل مع أي أطر عمل ويب (Actix، Rocket، Axum).



2. simd-json - أقصى أداء



simd-json هي مكتبة تستخدم تعليمات SIMD (Single Instruction, Multiple Data) للمعالج لتسريع تحليل JSON. وفقًا للاختبارات، فهي أسرع بمقدار 2-3 مرات من serde_json على كميات كبيرة من البيانات.



التثبيت:



[dependencies]simd-json = "0.14"


مثال: تحليل سريع



use simd_json::prelude::*;use simd_json::BorrowedValue;

fn main() { let mut data = br#"[{"city":"موسكو","temp":22},{"city":"سانت بطرسبرغ","temp":18}]"#.to_vec(); // التحليل مع تغيير بيانات الإدخال (للسرعة) let value: BorrowedValue = simd_json::to_borrowed_value(&mut data).unwrap(); if let Some(arr) = value.as_array() { for item in arr { let city = item.get("city").and_then(|v| v.as_str()).unwrap_or("غير معروف"); let temp = item.get("temp").and_then(|v| v.as_f64()).unwrap_or(0.0); println!("{}: {}°C", city, temp); } }}


الميزات:

  • يعمل فقط على x86-64 مع دعم AVX2 (المعالجات الحديثة).
  • يتطلب بيانات إدخال قابلة للتغيير (لتجنب التخصيصات غير الضرورية).
  • يدعم تحليل التدفق والتسلسل عبر ماكرو simd_json::json!.


<

توصيات