ktor 与 kotlinx 序列化:如何使用 JSON.nonstrict

Rod*_*ler 10 kotlin ktor kotlinx.serialization

我正在尝试初始化 Ktor http 客户端并设置 json 序列化。我需要允许JSON.nonstrict对象允许的非严格反序列化。只是无法了解如何将此设置应用于序列化程序。

 val client = HttpClient {
                install(JsonFeature) {
                    serializer = KotlinxSerializer()                    
                }
        }
Run Code Online (Sandbox Code Playgroud)

Dr.*_*cky 14

Kotlin 1.4.0发布后:

使用它来将字符串转换为对象:

val response = Json {
    ignoreUnknownKeys = true
}.decodeFromString(ResponseObject.serializer(), jsonString)
Run Code Online (Sandbox Code Playgroud)

对于您的 httpClient 使用:

HttpClient {
    install(JsonFeature) {
        serializer = KotlinxSerializer()
    }
    install(Logging) {
        logger = Logger.DEFAULT
        level = LogLevel.ALL
    }
}
Run Code Online (Sandbox Code Playgroud)


Rod*_*ler 10

想通了 - 我们可以传入构造函数:

serializer = KotlinxSerializer(Json.nonstrict)
Run Code Online (Sandbox Code Playgroud)

  • 现在已弃用。 (4认同)

Jac*_*s.S 9

您可以使用传递到 KotlinxSerializer 的 Json 构建器指定 json 配置。

val client = HttpClient {
    install(JsonFeature) {
        serializer = KotlinxSerializer(Json {
            isLenient = true
            ignoreUnknownKeys = true
        })                    
    }
}
Run Code Online (Sandbox Code Playgroud)

Json 构建器的确切字段是实验性的,可能会发生变化,因此请在此处查看源代码。


Max*_*ruz 6

这种变化经常发生,但是在 Kotlin 1.4.10 和 Ktor 1.4.1 中你需要传递一个kotlinx Json(小心,因为还有一个io.ktor.client.features.json.Json,我使用了一个导入别名来区分它们,因为我需要两者import kotlinx.serialization.json.Json as KotlinJson

val client = HttpClient {
    install(JsonFeature) {
        serializer = KotlinxSerializer(KotlinJson { ignoreUnknownKeys = true })
    }
    ...
Run Code Online (Sandbox Code Playgroud)


moc*_*dwi 5

对于那些使用改造的人,您可能需要考虑JsonConfiguration(strictMode = false)在改造构建器上使用。

例如:

// your retrofit builder
Retrofit.Builder()
        .baseUrl(url)
        .client(okHttpClient)
        .client(httpClient)
        .addConverterFactory(
          Json(JsonConfiguration(strictMode = false))
              .asConverterFactory(MediaType.get("application/json")
        )
)
Run Code Online (Sandbox Code Playgroud)

来源:kotlinx github 上的问题

  • Json {ignoreUnknownKeys = true }.asConverterFactory(contentType) (3认同)