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