Làm việc với JSON trong Kotlin
🎯 Mục tiêu: Parse và serialize JSON với kotlinx.serialization - thư viện chính thức của Kotlin.
💡 Giới thiệu
kotlinx.serialization là thư viện serialization chính thức của JetBrains cho Kotlin.
// build.gradle.kts
plugins {
kotlin("plugin.serialization") version "1.9.0"
}
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")
}📝 Cú pháp cơ bản
import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable
data class User(val name: String, val age: Int)
fun main() {
// Object → JSON
val user = User("Alice", 25)
val json = Json.encodeToString(user)
println(json) // {"name":"Alice","age":25}
// JSON → Object
val parsed = Json.decodeFromString<User>(json)
println(parsed) // User(name=Alice, age=25)
}🔧 Nested Objects
@Serializable
data class Address(val city: String, val zipCode: String)
@Serializable
data class User(
val name: String,
val address: Address
)
fun main() {
val user = User("Alice", Address("Hanoi", "100000"))
val json = Json.encodeToString(user)
// {"name":"Alice","address":{"city":"Hanoi","zipCode":"100000"}}
}📦 Lists và Maps
@Serializable
data class Team(
val name: String,
val members: List<String>,
val scores: Map<String, Int>
)
fun main() {
val team = Team(
"Alpha",
listOf("Alice", "Bob"),
mapOf("Alice" to 100, "Bob" to 95)
)
println(Json.encodeToString(team))
}🎯 Custom Serialization
@Serializable
data class User(
@SerialName("user_name") val name: String,
val age: Int = 0, // Default value
@Transient val password: String = "" // Không serialize
)
// JSON config
val prettyJson = Json { prettyPrint = true }
val lenientJson = Json { ignoreUnknownKeys = true }🛠️ Thực hành
// TODO: Parse API response
val jsonString = """
{
"status": "success",
"data": {
"users": [
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]
}
}
"""Lời giải:
@Serializable
data class UserData(val id: Int, val name: String)
@Serializable
data class DataWrapper(val users: List<UserData>)
@Serializable
data class ApiResponse(
val status: String,
val data: DataWrapper
)
fun main() {
val response = Json.decodeFromString<ApiResponse>(jsonString)
response.data.users.forEach {
println("${it.id}: ${it.name}")
}
}✅ Checklist
- Setup kotlinx.serialization
- Dùng
@Serializableannotation - Parse JSON với
Json.decodeFromString - Serialize với
Json.encodeToString - Sử dụng
@SerialName,@Transient
Tiếp theo: Coroutines Basics
Last updated on