4

我正在使用 Kotlin 1.5.10 和 ktor 1.6.0。

当我执行网络获取时

    private suspend fun getHello(): Model.Result {
        return httpClient.get("https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&srsearch=multiplatform")
    }

使用数据模型

    object Model {
        @Serializable
        data class Result(val query: Query)
        @Serializable
        data class Query(val searchinfo: SearchInfo)
        @Serializable
        data class SearchInfo(val totalhits: Int)
    }

Android版本编译良好并响应

Result(query=Query(searchInfo=SearchInfo(totalhits=707)))

但是,当我在 iOS 中编译它时,它会返回崩溃

RESPONSE https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&srsearch=multiplatform failed with exception: 
kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen kotlin.collections.HashMap@2566888

这个StackOverflow建议下载到1.3.10,但我不能这样做,因为 KMM 不会在我最新的 Android Studio 4.2.1 中编译。此外,我不将协程用于 commonMain 代码(仅在 Android 代码中)。

这个StackOverflow状态问题与Kodein,但我不使用Kodein

注意:我的代码与https://www.youtube.com/watch?v=_Q62iJoNOfg相同,只是模型和 URL 不同。

任何人都可以推荐我们如何解决这个问题?

4

1 回答 1

7

我在这里发现了一个问题https://github.com/Kotlin/kotlinx.serialization/issues/1450

我尝试了一种解决方法,即useAlternativeNames = falseJson 序列化配置,然后它解决了我的问题

        install(JsonFeature) {
            val json = kotlinx.serialization.json.Json {
                ignoreUnknownKeys = true
                useAlternativeNames = false
            }
            serializer = KotlinxSerializer(json)
        }
于 2021-06-14T11:54:12.317 回答