تحويل JSON إلى بنى Rust Serde — Numio
يُنشئ structs في Rust مع اشتقاقات Serialize وDeserialize من serde انطلاقًا من عيّنة JSON. تصبح الحقول بصيغة snake_case مع سمة rename_all، وتصبح المفاتيح المفقودة من بعض عناصر المصفوفة Option<T>، وتصبح قيم null هي serde_json::Value.
تحديد أنواع استجابة API من طرف ثالث قبل إلغاء تسلسلها باستخدام serde_json في عميل reqwest.
JSON
Rust Serde
متى تستخدمها
- تحديد أنواع استجابة API من طرف ثالث قبل إلغاء تسلسلها باستخدام serde_json في عميل reqwest.
- كتابة structs لملف إعدادات أو fixture بصيغة JSON في أداة CLI بلغة Rust أو خدمة Axum.
طريقة الاستخدام
- الصق عيّنة JSON؛ وإذا كان حقل ما اختياريًا فأدرج عناصر مصفوفة تحتويه وأخرى لا تحتويه.
- افتح الإعدادات واختر Property Name Format بما يطابق المفاتيح في الـ JSON (الافتراضي camelCase). يضبط ذلك #[serde(rename_all = ...)]؛ والمفاتيح التي لا تطابقه تحصل على #[serde(rename = ...)].
- انسخ الشيفرة وأضف serde (مع derive) وserde_derive وserde_json إلى Cargo.toml، كما تتوقع أسطر use المُنشأة.
إدخال JSON
{
"orderId": "A-1001",
"total": 19.5,
"paid": true,
"coupon": null,
"items": [
{ "sku": "PEN-01", "qty": 2 },
{ "sku": "BOOK-7", "qty": 1, "giftWrap": true }
]
}Rust structs (serde)
use serde_derive::Deserialize;
use serde_derive::Serialize;
use serde_json::Value;
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Root {
pub order_id: String,
pub total: f64,
pub paid: bool,
pub coupon: Value,
pub items: Vec<Item>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Item {
pub sku: String,
pub qty: i64,
pub gift_wrap: Option<bool>,
}التفاصيل والقيود
يجري الإنشاء في متصفحك بوحدة WebAssembly الخاصة بـ json_typegen؛ ولا يُرسل شيء إلى خادم.
تصبح الأعداد الصحيحة i64 والعشرية f64. تعطي null والمصفوفات الفارغة serde_json::Value وVec<Value>؛ استبدلها بأنواع محددة مثل Option<String>.
تُعاد تسمية الكلمات المحجوزة في Rust: يصبح المفتاح المسمّى type هو type_field مع #[serde(rename = "type")].
كل struct يشتق Default وDebug وClone وPartialEq إلى جانب Serialize وDeserialize؛ احذف ما لا تحتاجه.
FAQ
ماذا يغيّر إعداد Property Name Format؟
يصف طريقة كتابة المفاتيح في الـ JSON، لا أسماء حقول Rust. الحقول دائمًا بصيغة snake_case؛ ويختار الإعداد قيمة rename_all كي يعيد serde ربطها بـ camelCase أو kebab-case أو PascalCase وغيرها.
كيف تُكتشف الحقول الاختيارية؟
عندما تختلف مفاتيح الكائنات في المصفوفة نفسها، تصبح المفاتيح المفقودة من بعض العناصر Option<T>. الحقل الموجود في كل عناصر العيّنة ليس اختياريًا، حتى لو كان الـ API يحذفه أحيانًا.
هل يمكن أن يكون جذر الـ JSON مصفوفة؟
نعم. تُنتج المصفوفة الجذرية pub type Root = Vec<Root2>; مع struct Root2 للعناصر.