Rust में JSON के साथ काम करना: पार्सिंग और सीरियलाइज़ेशन शुरुआती गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: Rust में JSON क्यों महत्वपूर्ण है

\n\n

JSON (JavaScript Object Notation) एक हल्का डेटा एक्सचेंज फॉर्मेट है जो वेब API, कॉन्फ़िगरेशन फ़ाइलों और इंटर-सर्विस कम्युनिकेशन के लिए डी-फैक्टो मानक बन गया है। Rust, एक सिस्टम प्रोग्रामिंग भाषा जो सुरक्षा और प्रदर्शन पर केंद्रित है, में JSON के साथ काम करना क्रेट्स (लाइब्रेरीज़) के शक्तिशाली इकोसिस्टम के माध्यम से किया जाता है।

\n\n

हालांकि Rust में JavaScript या Python की तरह JSON के लिए बिल्ट-इन सपोर्ट नहीं है, लेकिन इसकी टाइप सिस्टम और मेमोरी मैनेजमेंट का दृष्टिकोण JSON प्रोसेसिंग को न केवल सुरक्षित बनाता है, बल्कि अविश्वसनीय रूप से तेज़ भी बनाता है। इस लेख में, हम सीखेंगे कि JSON को Rust स्ट्रक्चर में कैसे पार्स करें, डेटा को वापस JSON में कैसे सीरियलाइज़ करें, और शुरुआती लोगों की सामान्य गलतियों से कैसे बचें।

\n\n

Rust में JSON के साथ काम करने का मुख्य टूल serde (Serialization/Deserialization framework) क्रेट है, जो serde_json के साथ मिलकर काम करता है। ये लाइब्रेरीज़ जीरो-कॉस्ट एब्स्ट्रैक्शन प्रदान करती हैं और जटिल नेस्टेड डेटा स्ट्रक्चर को सपोर्ट करती हैं।

\n\n

डिपेंडेंसीज़ इंस्टॉल और सेटअप करना

\n\n

शुरू करने से पहले, एक नया Rust प्रोजेक्ट बनाएं और Cargo.toml फ़ाइल में आवश्यक डिपेंडेंसीज़ जोड़ें:

\n\n
[dependencies]\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"
\n\n

serde क्रेट के लिए features = ["derive"] फ़्लैग आपको #[derive(Serialize, Deserialize)] मैक्रोज़ का उपयोग करने की अनुमति देता है, जो आपके स्ट्रक्चर को JSON में और वापस बदलने के लिए स्वचालित रूप से कोड जनरेट करते हैं। यह Rust की एक प्रमुख विशेषता है — आप न्यूनतम बॉयलरप्लेट कोड लिखते हैं, और कंपाइलर बाकी काम करता है।

\n\n

डिपेंडेंसीज़ जोड़ने के बाद, लाइब्रेरीज़ को डाउनलोड और कंपाइल करने के लिए cargo build चलाएं।

\n\n

JSON को Rust स्ट्रक्चर में पार्स करना (डिसीरियलाइज़ेशन)

\n\n

डेटा मॉडल बनाना

\n\n

सबसे पहले, Rust स्ट्रक्चर को परिभाषित करें जो आपके JSON डेटा से मेल खाते हों। मान लीजिए, हमारे पास एक उपयोगकर्ता की जानकारी वाला JSON है:

\n\n
{\n  "name": "राहुल",\n  "age": 30,\n  "email": "rahul@example.com",\n  "is_active": true\n}
\n\n

हम एक संबंधित स्ट्रक्चर बनाएंगे और सीरियलाइज़ेशन के लिए एट्रीब्यूट्स जोड़ेंगे:

\n\n
use serde::{Deserialize, Serialize};\n\n#[derive(Debug, Serialize, Deserialize)]\nstruct User {\n    name: String,\n    age: u32,\n    email: String,\n    is_active: bool,\n}
\n\n

#[derive(Debug)] मैक्रो आपको डीबगिंग के लिए स्ट्रक्चर को कंसोल पर प्रिंट करने की अनुमति देता है। इसके बिना आप println!("{:?}", user) का उपयोग नहीं कर सकते।

\n\n

JSON स्ट्रिंग को पार्स करना

\n\n

अब एक फंक्शन लिखते हैं जो JSON स्ट्रिंग लेता है और User स्ट्रक्चर लौटाता है:

\n\n
fn parse_user(json_str: &str) -> Result<User, serde_json::Error> {\n    let user: User = serde_json::from_str(json_str)?;\n    Ok(user)\n}\n\nfn main() {\n    let data = r#"\n        {\n            "name": "राहुल",\n            "age": 30,\n            "email": "rahul@example.com",\n            "is_active": true\n        }\n    "#;\n\n    match parse_user(data) {\n        Ok(user) => println!("उपयोगकर्ता: {:?}", user),\n        Err(e) => eprintln!("पार्सिंग त्रुटि: {}", e),\n    }\n}
\n\n

मुख्य बिंदु: serde_json::from_str स्वचालित रूप से JSON फ़ील्ड्स को स्ट्रक्चर के फ़ील्ड्स से मैप करता है। यदि JSON में फ़ील्ड के नाम Rust से भिन्न हैं (जैसे, JSON snake_case का उपयोग करता है और Rust camelCase), तो आप #[serde(rename = "फ़ील्ड_का_नाम")] एट्रीब्यूट का उपयोग कर सकते हैं।

\n\n

नेस्टेड स्ट्रक्चर को हैंडल करना

\n\n

JSON में अक्सर नेस्टेड ऑब्जेक्ट होते हैं। उपयोगकर्ता के पते वाले एक उदाहरण पर विचार करें:

\n\n
{\n  "name": "राहुल",\n  "address": {\n    "city": "दिल्ली",\n    "street": "चांदनी चौक",\n    "zip": "110006"\n  }\n}
\n\n

नेस्टेड स्ट्रक्चर बनाएं:

\n\n
#[derive(Debug, Serialize, Deserialize)]\nstruct Address {\n    city: String,\n    street: String,\n    zip: String,\n}\n\n#[derive(Debug, Serialize, Deserialize)]\nstruct User {\n    name: String,\n    address: Address,\n}
\n\n

अब serde_json::from_str स्वचालित रूप से नेस्टेड JSON को हैंडल करेगा।

\n\n

Rust डेटा को JSON में बदलना (सीरियलाइज़ेशन)

\n\n

डिसीरियलाइज़ेशन के विपरीत, सीरियलाइज़ेशन Rust स्ट्रक्चर को JSON स्ट्रिंग में बदलता है। यह API रिस्पॉन्स भेजने या कॉन्फ़िगरेशन फ़ाइलें सेव करने के लिए उपयोगी है।

\n\n
fn serialize_user(user: &User) -> Result<String, serde_json::Error> {\n    let json_string = serde_json::to_string_pretty(user)?;\n    Ok(json_string)\n}\n\nfn main() {\n    let user = User {\n        name: String::from("राहुल"),\n        age: 30,\n        email: String::from("rahul@example.com"),\n        is_active: true,\n    };\n\n    match serialize_user(&user) {\n        Ok(json) => println!("JSON आउटपुट:\n{}", json),\n        Err(e) => eprintln!("सीरियलाइज़ेशन त्रुटि: {}", e),\n    }\n}
\n\n

to_string_pretty मानव-पठनीय JSON उत्पन्न करता है। यदि आपको कॉम्पैक्ट आउटपुट चाहिए, तो to_string का उपयोग करें।

\n\n

सामान्य गलतियाँ और समाधान

\n\n

1. फ़ील्ड नाम बेमेल

\n\n

यदि JSON फ़ील्ड का नाम Rust स्ट्रक्चर फ़ील्ड से भिन्न है, तो #[serde(rename)] का उपयोग करें:

\n\n
#[derive(Debug, Serialize, Deserialize)]\nstruct User {\n    #[serde(rename = "full_name")]\n    name: String,\n}
\n\n

2. वैकल्पिक फ़ील्ड

\n\n

यदि कोई फ़ील्ड JSON में मौजूद नहीं हो सकता है, तो Option का उपयोग करें:

\n\n
#[derive(Debug, Serialize, Deserialize)]\nstruct User {\n    name: String,\n    email: Option<String>,  // email वैकल्पिक है\n}
\n\n

3. डिफ़ॉल्ट मान

\n\n

गुम फ़ील्ड के लिए डिफ़ॉल्ट मान सेट करने के लिए #[serde(default)] का उपयोग करें:

\n\n
#[derive(Debug, Serialize, Deserialize)]\nstruct Config {\n    #[serde(default = "default_timeout")]\n    timeout: u32,\n}\n\nfn default_timeout() -> u32 { 30 }
\n\n

निष्कर्ष

\n\n

Rust में JSON के साथ काम करना serde और serde_json क्रेट्स की बदौलत सरल और शक्तिशाली है। इस गाइड में, हमने कवर किया:

\n\n
    \n
  • JSON को Rust स्ट्रक्चर में पार्स करना (डिसीरियलाइज़ेशन)
  • \n
  • Rust डेटा को JSON में बदलना (सीरियलाइज़ेशन)
  • \n
  • नेस्टेड स्ट्रक्चर और वैकल्पिक फ़ील्ड को हैंडल करना
  • \n
  • सामान्य गलतियों से बचना
  • \n
\n\n

अब आप अपने Rust प्रोजेक्ट्स में JSON का उपयोग शुरू कर सकते हैं। अभ्यास के लिए, विभिन्न JSON स्ट्रक्चर के साथ प्रयोग करें और serde की पूरी क्षमता को अनलॉक करें।

ब्लॉग

पुस्तक अनुशंसाएँ