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

时间:2018-11-29 20:55:53

标签: kotlin ktor kotlinx.serialisation

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

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

9 个答案:

答案 0 :(得分:4)

您可以使用Json构建器指定json配置,并将其传递给KotlinxSerializer。

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

“ Json”构建器的确切字段是实验性的,随时可能更改,因此请查看source code here.

答案 1 :(得分:2)

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

serializer = KotlinxSerializer(JSON.nonstrict)

答案 2 :(得分:2)

对于“ 1.0.0RC”版本,翻新使用如下。

StartState.lua

答案 3 :(得分:2)

此更改非常频繁,但是对于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 })
    }
    ...

答案 4 :(得分:1)

对于使用改造的用户,您可能需要考虑在改造生成器上使用JsonConfiguration(strictMode = false)

例如:

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

来源:issue on the kotlinx github

答案 5 :(得分:1)

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

install(JsonFeature) {
    serializer = KotlinxSerializer(kotlinx.serialization.json.Json(JsonConfiguration.Stable.copy(strictMode = false))).apply {
      useDefaultTransformers = true
    }
}

答案 6 :(得分:1)

发布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
                }
            }

答案 7 :(得分: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()

答案 8 :(得分:1)

似乎对于 1.4.32 我有如下:

install(JsonFeature) {
                    serializer = KotlinxSerializer(json = kotlinx.serialization.json.Json {
                        isLenient = true
                        ignoreUnknownKeys = true
                    })
                }