0Pricing
Learn Rust Coding · บทเรียน

การทำงานกับ JSON

serde_json

การทำงานกับ JSON เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

crate serde_json

serde_json เป็น implementation ของรูปแบบ JSON สำหรับ serde โดยมีฟังก์ชันสำหรับแปลงระหว่างค่า Rust กับข้อความ JSON

  • to_string / from_str สำหรับข้อความ
  • Value สำหรับ JSON แบบไดนามิก

แปลง struct เป็นข้อความ JSON

serde_json::to_string ทำซีเรียลไลซ์ค่าใด ๆ ที่เป็น Serialize ให้เป็นข้อความ JSON

use serde::Serialize;

#[derive(Serialize)]
struct User { id: u32, name: String }

fn main() {
    let u = User { id: 1, name: "Alice".to_string() };
    let json = serde_json::to_string(&u).unwrap();
    println!("{}", json);
}

แปลงข้อความ JSON เป็น struct

serde_json::from_str แยกวิเคราะห์ JSON ให้เป็นค่าที่มีชนิดข้อมูลชัดเจน และคืนค่าเป็น Result เพื่อให้คุณจัดการกับอินพุตที่ไม่ถูกต้องได้

use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct User { id: u32, name: String }

fn main() {
    let data = r#"{"id":1,"name":"Alice"}"#;
    let u: User = serde_json::from_str(data).unwrap();
    println!("{:?}", u);
}

การแสดงผลแบบอ่านง่าย

ใช้ to_string_pretty เพื่อสร้าง JSON ที่มีการเยื้องและอ่านได้ง่าย เหมาะสำหรับไฟล์การตั้งค่าและการแก้ไขข้อผิดพลาด

use serde::Serialize;

#[derive(Serialize)]
struct Cfg { debug: bool, level: u8 }

fn main() {
    let c = Cfg { debug: true, level: 3 };
    println!("{}", serde_json::to_string_pretty(&c).unwrap());
}

มาโคร json!

สร้าง JSON แบบเขียนตรงจุดด้วยมาโคร json! ซึ่งสร้าง Value ได้โดยไม่ต้องกำหนด struct

use serde_json::json;

fn main() {
    let v = json!({
        "name": "Alice",
        "roles": ["admin", "user"]
    });
    println!("{}", v);
}

ชนิดข้อมูล Value

serde_json::Value เป็น enum ที่แทนโหนด JSON ได้ทุกชนิด ได้แก่ null, บูลีน, ตัวเลข, ข้อความ, อาร์เรย์ หรือออบเจ็กต์ ใช้เมื่อยังไม่ทราบโครงสร้าง

use serde_json::Value;

fn main() {
    let data = r#"{"name":"Bob","age":30}"#;
    let v: Value = serde_json::from_str(data).unwrap();
    println!("{}", v["name"]);
    println!("{}", v["age"]);
}

อ่านค่าจาก Value อย่างปลอดภัย

การเข้าถึงด้วยดัชนีจะคืนค่าเป็น Value ให้ใช้เมธอดเข้าถึง เช่น as_str หรือ as_i64 ซึ่งคืนค่าเป็น Option เพื่ออ่านข้อมูลตามชนิดอย่างปลอดภัย

use serde_json::Value;

fn name_of(v: &Value) -> Option<&str> {
    v.get("name")?.as_str()
}

จำลองการเข้าถึง JSON ด้วย Rust ปกติ

การอ่านค่าด้วยคีย์พร้อมค่าทดแทนเมื่อไม่มีคีย์นั้น สอดคล้องกับวิธีสอบถามออบเจ็กต์ Value ตัวอย่างนี้ใช้ HashMap

use std::collections::HashMap;

fn main() {
    let mut obj: HashMap<&str, &str> = HashMap::new();
    obj.insert("name", "Alice");
    let name = obj.get("name").copied().unwrap_or("unknown");
    let city = obj.get("city").copied().unwrap_or("unknown");
    println!("name={} city={}", name, city);
}

ไบต์และตัวเขียนข้อมูล

เพื่อประสิทธิภาพ to_vec จะทำซีเรียลไลซ์เป็นไบต์ ส่วน to_writer จะส่งข้อมูลโดยตรงไปยัง io::Write ใด ๆ เช่น ไฟล์หรือซ็อกเก็ต

use serde::Serialize;

#[derive(Serialize)]
struct Msg { text: String }

fn to_bytes(m: &Msg) -> Vec<u8> {
    serde_json::to_vec(m).unwrap()
}

จัดการข้อผิดพลาดจากการแยกวิเคราะห์

from_str คืนค่าเป็น Result ให้ตรวจสอบข้อผิดพลาดเพื่อแสดงข้อความที่เป็นประโยชน์แก่ผู้ใช้แทนการทำให้โปรแกรมหยุดทำงาน

use serde::Deserialize;

#[derive(Deserialize)]
struct User { id: u32 }

fn parse(s: &str) -> String {
    match serde_json::from_str::<User>(s) {
        Ok(u) => format!("id {}", u.id),
        Err(e) => format!("invalid JSON: {}", e),
    }
}

แปลงระหว่าง Value กับ struct

serde_json::from_value และ to_value ใช้แปลงระหว่าง struct ที่มีชนิดข้อมูลชัดเจนกับ Value แบบไดนามิกเมื่อคุณต้องการใช้ทั้งสองแบบ

use serde::Deserialize;
use serde_json::json;

#[derive(Deserialize)]
struct User { name: String }

fn main() {
    let v = json!({"name": "Eve"});
    let u: User = serde_json::from_value(v).unwrap();
    println!("{}", u.name);
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับการทำงานกับ JSON

สรุป

คุณได้เรียนรู้การจัดการ JSON ด้วย serde_json:

  • to_string / from_str ใช้แปลงระหว่าง struct กับข้อความ JSON
  • to_string_pretty จัดรูปแบบให้อ่านง่าย
  • มาโคร json! และ Value ใช้จัดการ JSON แบบไดนามิก
  • ใช้เมธอดเข้าถึงและ Result เพื่ออ่านและแยกวิเคราะห์อย่างปลอดภัย

ถัดไป: ปรับแต่งการทำซีเรียลไลซ์ด้วยแอตทริบิวต์ของฟิลด์

คำถามที่พบบ่อย

บทเรียน “การทำงานกับ JSON” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การทำงานกับ JSON” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การทำงานกับ JSON”

serde_json คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การทำงานกับ JSON” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม

ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การทำให้เป็นอนุกรมและการแยกกลับจากอนุกรม
  2. การทำงานกับ JSON
  3. การทำให้เป็นอนุกรมแบบกำหนดเอง
  4. รูปแบบอื่น
← กลับไปที่ Learn Rust Coding