یاد بگیرید که چگونه داده ها را بین فرمت JSON و اشیاء Rust بدون زحمت با استفاده از تکنیک های سریال سازی و سریال سازی در Rust تبدیل کنید.
JSON (JavaScript Object Notation) به دلیل سادگی، خوانایی و پشتیبانی گسترده در زبان های برنامه نویسی مختلف، به عنوان یک فرمت تبادل داده محبوب در توسعه نرم افزار ظهور کرده است. JSON یک جایگزین سبک وزن برای XML برای انتقال داده ها بین یک سرور و یک برنامه وب یا بین اجزای مختلف سیستم نرم افزاری است.
یکی از جنبههای کلیدی کار با JSON، فرآیند سریالسازی و سریالزدایی است که به شما امکان میدهد دادههای JSON را به یک قالب ساختاریافته تبدیل کنید که بتوانید به راحتی در برنامههای خود دستکاری کنید. اغلب اوقات، اگر میخواهید با JSON به زبانهای دیگر کار کنید، ممکن است نیاز داشته باشید که دادههای JSON را در ساختارهای داده داخلی زبان سریالسازی کرده و از سریال خارج کنید.
شروع کار با Serde
Serde (سریال سازی و سریال زدایی) یک کتابخانه Rust پرکاربرد است که چارچوبی را برای تبدیل ساختارهای داده Rust به فرمت هایی برای ذخیره سازی، انتقال، اشتراک گذاری و موارد دیگر فراهم می کند.
Serde تبدیل یکپارچه بین انواع دادههای Rust و فرمتهای مختلف تبادل داده، از جمله JSON، YAML، BSON، CBOR، MessagePack و غیره را امکانپذیر میکند.
تمرکز اصلی Serde این است که فرآیند سریالسازی و سریالسازی را تا حد امکان ساده و کارآمد کند و در عین حال ویژگیهای تایپ و ایمنی قوی را حفظ کند.
برای نصب و استفاده از Serde به عنوان وابستگی شخص ثالث با Cargo، این دستورالعمل ها را به بخش وابستگی ها در فایل Cargo.toml خود اضافه کنید.
[dependencies]
serde = { version = "1.0.159" , features = ["derive"] }
serde_json = "1.0.96"
برای تعامل با JSON به هر دو جعبه serde و serde_json نیاز دارید. جعبه serde عملکردهای اصلی را ارائه می دهد و جعبه serde_json یک پیاده سازی خاص از Serde برای کار با JSON است.
در اینجا چگونه می توانید جعبه serde_json و ماژول های Serialize و Deserialize را از جعبه serde وارد کنید:
use serde::{Serialize, Deserialize};
use serde_json;
به طور کلی، اگر با JSON در Rust کار می کنید، Serde ابزار قدرتمندی است که در زرادخانه توسعه خود به آن نیاز خواهید داشت.
سریال سازی داده ها با Serde
فرآیند سریال سازی JSON مستلزم تبدیل نوع Rust (سفارشی یا داخلی) به JSON برای سایر عملیات است. Serde مجموعهای از ویژگیها را ارائه میکند که میتوانید با Rust struct برای فعال کردن کنترل دقیق بر فرآیند سریالسازی استفاده کنید، از جمله ویژگی #[derive(Serialize)] که به شما امکان میدهد کد سریالسازی را برای ساختارهای دادهتان تولید کنید و ساختار Rust خود را به JSON تبدیل کنید.
این ساختار را نشان دهنده داده های زیستی یک فرد در نظر بگیرید. در اینجا نحوه وارد کردن و استفاده از ویژگی Serialize در ساختار آمده است:
use serde::{Serialize, Deserialize};
use serde_json;
#[derive(Serialize)]
struct Person {
name: String,
age: u32,
}
با حاشیهنویسی ساختار Person با [#derive(Serialize)]، به Serde میگویید که کد سریالسازی لازم را برای ساختار Person به صورت خودکار تولید کند.
در اینجا نحوه سریال سازی یک نمونه از ساختار Person به JSON آمده است:
use serde::{Serialize};
use serde_json;
fn main() {
// declaration of the Person struct instance with the name and age fields
let person = Person {
name: "Chukwuemeriwo".to_string(),
age: 28,
};
// serializes the person struct to JSON using the serde_json library
let json = serde_json::to_string(&person).expect("Serialization failed");
// prints the serialized JSON string
println!("Serialized JSON: {}", json);
}
در تابع اصلی، جعبه serde_json شی شخص را سریال می کند. تابع to_string یک ارجاع به شی شخص می گیرد و یک رشته JSON نشان دهنده داده های سریال شده را برمی گرداند.
در نهایت، تابع main JSON سریال شده را روی کنسول چاپ می کند.
serde و serde_json همه کاره هستند، شما همچنین می توانید آرایه ها را با serde سریال کنید.
use serde::{Serialize, Deserialize};
use serde_json;
#[derive(Serialize)]
struct Coordinates {
x: f32,
y: f32,
}
fn main() {
let points = vec![
Coordinates { x: 1.0, y: 2.0 },
Coordinates { x: 3.5, y: 4.5 },
];
let json = serde_json::to_string(&points).expect("Serialization failed");
println!("Serialized JSON: {}", json); // Print the serialized JSON string
}
متغیر نقاط بردار ساختارهای مختصات است که نقاط روی یک صفحه را نشان می دهد. اعمال ویژگی Serialize به ساختار Coordinates به شما این امکان را می دهد که بدون زحمت وکتور را به JSON سریال کنید.
علاوه بر این، شما می توانید enum ها را به JSON با serde سریال کنید، مانند ساختارها و بردارها.
use serde::{Serialize, Deserialize};
use serde_json;
#[derive(Serialize, Deserialize)]
enum Animal {
Dog(String),
Cat(u32),
Bird,
}
fn main() {
let dog = Animal::Dog("Rusty".to_string());
let json = serde_json::to_string(&dog).expect("Serialization failed");
println!("Serialized JSON: {}", json);
}
بسته به نوع، فرآیند سریال سازی مطابق با آن سازگار می شود (در این مورد، نوع Animal::Dog شامل یک فیلد String است که Serde آن را به عنوان یک رشته JSON سریال می کند).
Deserialization داده ها با Serde
JSON deserialization فرآیند تبدیل داده های JSON به انواع داده های بومی یک زبان برنامه نویسی است. Serde یک چارچوب جامع برای deserialization JSON ارائه می دهد که بر روی اکثر انواع داده های داخلی کار می کند.
مشابه سریال سازی، Serde ویژگی هایی را ارائه می دهد که می توانید از آنها برای حاشیه نویسی ساختارهای Rust خود برای فرآیند deserialization استفاده کنید. دو ویژگی متداول برای سریال سازی، ویژگی های #[derive(Deserialize)] و #[serde(rename = “json_field_name”)] هستند.
ویژگی #[derive(Deserialize)] به طور خودکار اجرای deserialization را برای انواع ساختار Rust شما مشتق می کند، در حالی که ویژگی #[serde(rename = “json_field_name”)] به شما امکان می دهد فیلدهای ساختار را به نام فیلدهای JSON مربوطه نگاشت کنید.
در اینجا نحوه تبدیل داده های JSON به یک نوع ساختار سفارشی با Serde آمده است:
use serde::Deserialize;
use serde_json;
// defines a struct for Person with the Deserialize trait from Serde
#[derive(Deserialize)]
struct Person {
#[serde(rename = "name")] // renames the field to "name"
full_name: String,
age: u32,
}
fn main() {
let json_data = r#"
{
"name": "John Doe",
"age": 30
}
"#;
// deserializes the JSON data into a Person struct
let person: Person = serde_json::from_str(json_data).unwrap();
// Print the full name and age of the person
println!("Name: {}", person.full_name);
println!("Age: {}", person.age);
}
با حاشیهنویسی ساختار Person با ویژگی #[derive(Deserialize)]، نشان میدهید که Serde میتواند ساختار را از JSON جداسازی کند. ویژگی #[serde(rename = “name”)] فیلد نام را در JSON به قسمت نام کامل نگاشت می کند.
تابع from_str متغیر json_data را به شی شخص تبدیل می کند و تابع اصلی فیلدها را در کنسول چاپ می کند.
Serde از deserialization در انواع مختلف داده Rust، از جمله انواع اولیه، enums، ساختارهای تودرتو، و مجموعه ها پشتیبانی می کند.
در اینجا نحوه تبدیل یک آرایه JSON به ساختار Rust حاوی یک فیلد برداری آمده است:
use serde::Deserialize;
#[derive(Deserialize)]
struct Data {
numbers: Vec<u32>,
}
fn main() {
let json_data = r#"
{
"numbers": [1, 2, 3, 4, 5]
}
"#;
let data: Data = serde_json::from_str(json_data).unwrap();
for number in data.numbers {
println!("Number: {}", number);
}
}
تابع اصلی محتوای JSON json_data را به متغیر داده تبدیل می کند و حلقه عناصر را در بردار چاپ می کند.
شما باید اطمینان حاصل کنید که انواع داده ها و شناسه های مناسب را برای فرآیند deserialization دارید.
Serde با چارچوب های وب محبوب Rust کار می کند
Serde یک کتابخانه قدرتمند با ویژگی های بسیار و یک API ساده برای سریال سازی و جداسازی داده ها در قالب های مختلف است.
Serde به طور گسترده در اکوسیستم Rust پذیرفته شده است، و بسیاری از جعبهها و چارچوبهای محبوب از Serde پشتیبانی داخلی دارند، از جمله چارچوبهای وب محبوب مانند Actix، Warp، و Rocket و ORMهای پایگاه داده مانند Diesel.