簡介

比起一般的文字資料,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

Last modified: 2025 年 7 月 16 日

Author

Comments

Write a Reply or Comment

Your email address will not be published.