12

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

 val client = HttpClient {
                install(JsonFeature) {
                    serializer = KotlinxSerializer()                    
                }
        }
4

9 回答 9

13

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

val client = HttpClient {
    install(JsonFeature) {
        serializer = KotlinxSerializer(Json {
            isLenient = true
            ignoreUnknownKeys = true
        })                    
    }
}

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

于 2020-06-28T14:00:09.970 回答
10

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

serializer = KotlinxSerializer(Json.nonstrict)
于 2018-11-29T21:51:59.947 回答
7

这种变化非常频繁,但是对于 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 })
    }
    ...
于 2020-11-01T20:58:28.697 回答
6

Kotlin 1.4.0发布后:

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

val response = Json {
    ignoreUnknownKeys = true
}.decodeFromString(ResponseObject.serializer(), jsonString)

对于您的 httpClient 使用:

HttpClient {
    install(JsonFeature) {
        serializer = KotlinxSerializer()
    }
    install(Logging) {
        logger = Logger.DEFAULT
        level = LogLevel.ALL
    }
}
于 2020-08-20T10:07:24.907 回答
3

根据上面 Rodion Altshuler 的回答,这对我的 KMP 项目有用:

install(JsonFeature) {
    serializer = KotlinxSerializer(kotlinx.serialization.json.Json(JsonConfiguration.Stable.copy(strictMode = false))).apply {
      useDefaultTransformers = true
    }
}
于 2020-02-21T15:00:35.747 回答
3

对于“1.0.0RC”版本,加装后使用如下。

Retrofit.Builder()
        .client(okHttpClient)
        .baseUrl(Env.BASE_URL)
        .addConverterFactory(Json{
            isLenient = true
            ignoreUnknownKeys = true
        }.asConverterFactory(MediaType.get("application/json")))
        .addCallAdapterFactory(CoroutineCallAdapterFactory())
        .build()
于 2020-09-26T06:50:58.343 回答
3

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

例如:

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

来源:kotlinx github上的问题

于 2019-10-12T14:43:06.680 回答
1

这是为 Spring 反应式 Web 客户端配置 JsonConfig 的方式:



val json = Json { ignoreUnknownKeys = true isLenient = true }

val strategies = ExchangeStrategies
    .builder()
    .codecs { clientDefaultCodecsConfigurer ->
        run {
            clientDefaultCodecsConfigurer.defaultCodecs()
                .kotlinSerializationJsonDecoder(KotlinSerializationJsonDecoder(json))
            clientDefaultCodecsConfigurer.defaultCodecs()
                .kotlinSerializationJsonEncoder(KotlinSerializationJsonEncoder(json))

        }
    }.build()

return WebClient
    .builder()
    .exchangeStrategies(strategies)
    .baseUrl(baseUrl!!)
    .build()
于 2021-03-22T17:56:26.460 回答
1

似乎对于 1.4.32 我有如下:

install(JsonFeature) {
                    serializer = KotlinxSerializer(json = kotlinx.serialization.json.Json {
                        isLenient = true
                        ignoreUnknownKeys = true
                    })
                }
于 2021-04-13T22:37:43.703 回答