Kotlin Academy · บทเรียน

การเจรจาเนื้อหาและ kotlinx.serialization

กำหนดค่าการทำซีเรียลไลซ์ JSON และดีซีเรียลไลซ์เนื้อหาคำขอโดยอัตโนมัติ

บทเรียน 3 จาก 413 ขั้นตอน

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

การเจรจาเนื้อหาคืออะไร

การเจรจาเนื้อหาคือกลไกของ HTTP ที่ไคลเอ็นต์และเซิร์ฟเวอร์ใช้ตกลงรูปแบบของเนื้อหาการตอบกลับ ไคลเอ็นต์จะส่งเฮดเดอร์ Accept และเซิร์ฟเวอร์จะเลือกรูปแบบที่ตรงกันมากที่สุด ปลั๊กอิน ContentNegotiation ของ Ktor จะทำงานนี้โดยอัตโนมัติ

การเพิ่มการอ้างอิง

เพิ่มปลั๊กอิน ContentNegotiation และตัวแปลง JSON ของ kotlinx.serialization:

dependencies {
    implementation("io.ktor:ktor-server-content-negotiation:2.3.12")
    implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.12")
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1")
}

การติดตั้ง ContentNegotiation

ติดตั้งปลั๊กอินในโมดูล Application และลงทะเบียนตัวแปลง JSON:

import io.ktor.server.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.json.*

fun Application.configureSerialization() {
    install(ContentNegotiation) {
        json()
    }
}

คลาสข้อมูล @Serializable

ใส่คำอธิบายประกอบ @Serializable จาก kotlinx.serialization ให้กับคลาสข้อมูลของคุณ ปลั๊กอินคอมไพเลอร์ Kotlin จะสร้างตัวแปลงอนุกรมขณะคอมไพล์ จึงไม่จำเป็นต้องใช้การสะท้อนขณะทำงาน:

import kotlinx.serialization.Serializable

@Serializable
data class User(val id: Long, val name: String, val email: String)

การตอบกลับด้วยออบเจ็กต์ที่ Serializable

เมื่อติดตั้ง ContentNegotiation แล้ว ให้ส่งออบเจ็กต์ @Serializable ใด ๆ ไปยัง call.respond() Ktor จะแปลงออบเจ็กต์นั้นเป็น JSON โดยอัตโนมัติ:

get("/users/{id}") {
    val user = User(1L, "Alice", "alice@example.com")
    call.respond(user)  // serialized to JSON
}

การรับออบเจ็กต์ที่ Serializable

ใช้ call.receive() เพื่อแปลงเนื้อหาคำขอเป็นคลาส @Serializable หากเนื้อหามีรูปแบบไม่ถูกต้อง Ktor จะส่งข้อผิดพลาด ContentTransformationException:

post("/users") {
    val newUser = call.receive<User>()
    call.respond(HttpStatusCode.Created, newUser)
}

การปรับแต่งการกำหนดค่า JSON

ส่งอินสแตนซ์ Json ไปยัง json() เพื่อปรับแต่งการทำซีเรียลไลซ์ เช่น ละเว้นคีย์ที่ไม่รู้จัก แสดงผลให้อ่านง่าย ใช้โหมดผ่อนปรน เป็นต้น:

install(ContentNegotiation) {
    json(Json {
        prettyPrint = true
        isLenient = true
        ignoreUnknownKeys = true
    })
}

ประเภทเนื้อหาหลายประเภท

ลงทะเบียนตัวแปลงหลายตัวเพื่อรองรับประเภท Accept ที่แตกต่างกัน Ktor จะเลือกตัวแปลงตัวแรกที่ตรงกับเฮดเดอร์ Accept ของไคลเอ็นต์:

install(ContentNegotiation) {
    json()
    // xml() with ktor-serialization-kotlinx-xml if needed
}

การทำซีเรียลไลซ์ลิสต์และแมป

ห่อคอลเลกชันไว้ในออบเจ็กต์การตอบกลับ หรือใช้ call.respond(list) ได้โดยตรง kotlinx.serialization รองรับ List, Map และเจเนอริกที่ซ้อนกัน ตราบใดที่ประเภทของสมาชิกมีคำอธิบายประกอบ @Serializable:

get("/users") {
    val users = listOf(
        User(1, "Alice", "a@example.com"),
        User(2, "Bob", "b@example.com")
    )
    call.respond(users)
}

ตัวแปลงอนุกรมแบบกำหนดเอง

สำหรับประเภทที่คุณไม่ได้เป็นเจ้าของ (เช่น java.time.Instant) ให้ใช้งาน KSerializer และลงทะเบียนผ่าน @Serializable(with = MySerializer::class) หรือโมดูลตัวแปลงอนุกรมแบบบริบท:

val module = SerializersModule {
    contextual(Instant::class, InstantSerializer)
}
install(ContentNegotiation) {
    json(Json { serializersModule = module })
}

การจัดการข้อผิดพลาดจากการแปลงกลับที่ล้มเหลว

ติดตั้งปลั๊กอิน StatusPages เพื่อส่งคืนการตอบกลับข้อผิดพลาดที่เหมาะสมเมื่อ call.receive() ทำงานไม่สำเร็จ:

install(StatusPages) {
    exception<ContentTransformationException> { call, _ ->
        call.respond(HttpStatusCode.BadRequest, "Invalid request body")
    }
}

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

คลาสข้อมูลของ Kotlin ต้องมีคำอธิบายประกอบใดจึงจะสามารถทำซีเรียลไลซ์ด้วย kotlinx.serialization ได้

ทบทวน: การเจรจาเนื้อหาและ kotlinx.serialization

ประเด็นสำคัญ:

  • ติดตั้ง ContentNegotiation + json() เพื่อทำซีเรียลไลซ์และดีซีเรียลไลซ์ JSON โดยอัตโนมัติ
  • ใส่คำอธิบายประกอบให้คลาสข้อมูลด้วย @Serializable
  • ใช้ call.respond(obj) เพื่อทำซีเรียลไลซ์ และใช้ call.receive() เพื่อทำดีซีเรียลไลซ์
  • ปรับแต่งได้ด้วยอินสแตนซ์ Json { ... } ที่ส่งให้ json()
  • ใช้ StatusPages เพื่อจัดการข้อผิดพลาดจากการดีซีเรียลไลซ์อย่างเหมาะสม
เริ่มต้นได้ฟรี

เรียนรู้ Kotlin ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

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

บทเรียน “การเจรจาเนื้อหาและ kotlinx.serialization” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การเจรจาเนื้อหาและ kotlinx.serialization”

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

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

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

บทเรียน “การเจรจาเนื้อหาและ kotlinx.serialization” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การตั้งค่าโปรเจกต์ Ktor: embeddedServer และโมดูลแอปพลิเคชัน
  2. การกำหนดเส้นทางและพารามิเตอร์ที่ระบุชนิด
  3. การเจรจาเนื้อหาและ kotlinx.serialization
  4. ปลั๊กอินการยืนยันตัวตน: JWT และ Session
← กลับไปที่ Kotlin Academy