我正在尝试初始化Ktor http客户端并设置json序列化。我需要允许 JSON.nonstrict 对象允许的非严格反序列化。只是无法获得如何将此设置应用于序列化程序。
val client = HttpClient {
install(JsonFeature) {
serializer = KotlinxSerializer()
}
}
答案 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")
)
)
答案 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
})
}