在 Kotlin 多平台中解析 JSON:io.ktor.serialization.JsonConvertException:非法输入

问题描述 投票:0回答:2

我第一次接触 Kotlin Multiplatform,并按照此处的指南进行操作

https://kotlinlang.org/docs/multiplatform-mobile-upgrade-app.html

我有课了

@Serializable
data class RocketLaunch (
    @SerialName("flight_number")
    val flightNumber: Int,
    @SerialName("name")
    val missionName: String,
    @SerialName("date_utc")
    val launchDateUTC: String,
    @SerialName("success")
    val launchSuccess: Boolean?,
)

我实例化了一个 HTTPClient 并调用 SpaceX URL,如指南中所述

private val httpClient = HttpClient {
        install(ContentNegotiation) {
            json(Json {
                prettyPrint = true
                isLenient = true
                ignoreUnknownKeys = true
            })
        }
    }

    @Throws(Exception::class)
    suspend fun greet(): String {
        val rockets: List<RocketLaunch> = httpClient.get("https://api.spacexdata.com/v4/launches").body()
        val lastSuccessLaunch = rockets.first() //{ it.launchSuccess == true }
        return "Guess what it is! > ${platform.name.reversed()}!"
                "\nThe last successful launch was ${lastSuccessLaunch.title} 🚀"
    }

当我运行它并捕获异常时,我得到了

kotlinx.serialization.json.internal.JsonDecodingException:预期 类 kotlinx.serialization.json.JsonObject (Kotlin 反射不是 可用)作为序列化主体 kotlinx.serialization.Polymorphic,但有类 kotlinx.serialization.json.JsonArray(Kotlin 反射不是 可用)

我已经仔细检查过,并且正确遵循了指南,并且 Feed 有效

插件

kotlin("plugin.serialization") 版本“1.8.10”

依赖关系

实现(“org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4”)

实现(“io.ktor:ktor-client-core:$ktorVersion”)

实现(“io.ktor:ktor-client-content-negotiation:$ktorVersion”)

实现(“io.ktor:ktor-serialization-kotlinx-json:$ktorVersion”)

json kotlin jetbrains-ide kotlin-multiplatform ktor
2个回答
1
投票

修复方法是添加

id(“kotlinx-序列化”) 例如

plugins {
    kotlin("multiplatform")
    id("com.android.library")
    id("kotlinx-serialization")
}

到共享的 build.gradle.kts 文件。我觉得这很奇怪,因为它被添加到项目一级,如下所示。

kotlin(“plugin.serialization”)版本“1.8.10”


0
投票

在共享 build.gradle.kts 中使用

id("org.jetbrains.kotlin.plugin.serialization") version "1.8.10"
而不是
kotlin("plugin.serialization") version "1.8.21"
。例如

plugins {
    kotlin("multiplatform")
    id("com.android.library")
    id("org.jetbrains.kotlin.plugin.serialization") version "1.8.21"
}
© www.soinside.com 2019 - 2024. All rights reserved.