هياكل Rust وSerde
تُعدّ Serde المعيار الفعلي للتسلسل JSON في Rust. يولّد المحوّل تعريفات هياكل مزيّنة بـ #[derive(Debug, Clone, Serialize, Deserialize)] — أكثر تركيبة اشتقاق شيوعًا لهياكل البيانات. يُفترض serde_json كوقت تشغيل فيعمل الكود المولّد مع serde_json::from_str وserde_json::to_string مباشرةً.
يتبع تعيين الأنواع محاور Rust: سلاسل JSON تصبح String والأعداد الصحيحة i64 والكسور العشرية f64 والقيم المنطقية bool والمصفوفات Vec<T>. الكائنات المتداخلة تولّد هياكل مسمّاة منفصلة. الحقول التي تكون null في JSON أو غائبة في بعض كائنات المصفوفة تُكتب Option<T> مع سمة #[serde(skip_serializing_if = "Option::is_none")] لحذفها عند كونها None.
تستخدم أسماء الحقول في Rust صيغة snake_case بينما يستخدم JSON كثيرًا camelCase. يُنتج المولّد #[serde(rename = "originalKey")] للحقول التي يختلف اسمها في Rust عن مفتاح JSON واختياريًا سمة الحاوية #[serde(rename_all = "camelCase")].
الملكية وعمر المتغيرات والأداء
تستخدم المخرجات الافتراضية أنواع String مملوكة لحقول النص مما يعني أن الهيكل يملك جميع بياناته ويمكن نقله وتخزينه بحرية. وضع بديل "مُستعار" يستبدل String بـ &str (مع معامل عمر) لتجنّب التخصيص عند إلغاء التسلسل من مخزن مؤقت تملكه مسبقًا.
لمستندات JSON الكبيرة تدعم serde_json إلغاء التسلسل بالبث عبر serde_json::Deserializer::from_reader. الهياكل المولّدة متوافقة تمامًا مع البث لأن تصميم serde القائم على السمات لا يعتمد على مصدر البيانات.
يعني مطابقة الأنماط الاستنفادية في Rust أن إضافة حقل جديد إلى استجابة JSON لن تكسر الكود الموجود بصمت. يمكن إضافة السمة #[serde(deny_unknown_fields)] للكشف عن مفاتيح JSON غير المتوقعة.
سير عمل تطوير Rust
يحتاج مطوّرو الواجهة الخلفية في Rust الذين يستخدمون Axum أو Actix-web أو Warp إلى نماذج طلب واستجابة مكتوبة بالأنواع. يولّد المحوّل هياكل تعمل مباشرةً مع مُستخرج Json<T> في Axum.
كثيرًا ما تحلّل أدوات CLI ونصوص معالجة البيانات في Rust ملفات إعداد JSON أو استجابات API. يُهيّئ المولّد تعريفات الهياكل حتى تتمكن من التركيز على منطق الأعمال.
مشاريع WebAssembly التي تستدعي واجهات JavaScript برمجية كثيرًا ما تتلقى بيانات JSON. هياكل serde المولّدة متوافقة مع wasm-bindgen وserde-wasm-bindgen.