簡介
比起一般的文字資料,json 是更為常用到的資料格式。
Ktor 提供了一些工具,可以把取得的 json 資料直接轉化為實例 (instance)。
我們這裏還需要用到 kotlinx serialization 來處理 Json 資料。
Json 資料來源:https://jsonplaceholder.typicode.com/posts,其結構如下:
[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
},
...
]
權限
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
依賴
我使用的 kotlin 版本是 2.1.20
一般方式
build.gradle.kts (Module level: app)
plugins {
...
id("org.jetbrains.kotlin.plugin.serialization") version "2.1.20"
}
dependencies {
...
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1")
implementation("io.ktor:ktor-client-core:3.0.2")
implementation("io.ktor:ktor-client-cio:3.0.2")
implementation("io.ktor:ktor-client-logging:3.0.2")
implementation("io.ktor:ktor-client-content-negotiation:3.0.2")
implementation("io.ktor:ktor-serialization-kotlinx-json:3.0.2")
}
Version Catalog 方式
libs.versions.toml
[versions]
...
kotlinx-serialization = "1.8.1"
ktor = "3.0.2"
[libraries]
...
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" }
ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" }
ktor-client-content-negotiation= { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" }
ktor-serialization-kotlinx-json= { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
[bundles]
ktor = [
"ktor-client-core",
"ktor-client-cio",
"ktor-client-logging",
"ktor-client-content-negotiation",
"ktor-serialization-kotlinx-json",
]
build.gradle.kts (module level :app)
...
dependencies {
...
implementation(libs.bundles.ktor)
}
主要程式碼
PostResponse.kt
@Serializable
data class PostResponse(
val body: String,
val title: String,
val id: Int,
val userId: Int,
)
這是依據 json 的資料結構所建立的資料類別,Ktor client 可以將 json 資料,直接轉化為這個類別的實例。
KtorClient.kt
class KtorClient {
private val client = HttpClient(CIO) {
defaultRequest{ url("https://jsonplaceholder.typicode.com/") }
install(Logging) {
logger = Logger.SIMPLE
}
install(ContentNegotiation) {
json(
Json {
ignoreUnknownKeys = true
}
)
}
}
suspend fun getPosts(): List<PostResponse> {
return client.get("posts").body()
}
}
MainActivity.kt
class MainActivity : ComponentActivity() {
private val ktorClient = KtorClient()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
LaunchedEffect(key1 = Unit) {
val posts = ktorClient.getPosts()
posts.forEach { println("${it.id}: ${it.title}") }
}
KtorKata20250624Theme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Column(
modifier = Modifier
.padding(innerPadding)
) {
Text(
text = version,
fontSize = 20.sp,
)
}
}
}
}
}
}
執行 app,就可以在 logcat 中,看到取得的 json 資料
參考資料
Setup Ktor for your Android app!
Practical API mapping Android example
Ktor Tutorial for Android & Kotlin Mult
https://ktor.io/docs/client-serialization.html#configure_serializer
Comments