数据类中的默认参数未使用ktor序列化程序转换为json



在http请求中将数据类序列化为json时,我遇到了一个奇怪的问题。

工作代码:

@Serializable
data class ComanyCustomerLoginData(
val email: String,
val credential: String,
val companyUUID: String,
)
val customerLoginData = ComanyCustomerLoginData("trwla@gmail.com", "1234", "d80f0b72-a062-11eb-bcbc-0242ac130002")
val response = client.post<HttpResponse>(URL) {
contentType(ContentType.Application.Json)
body = customerLoginData
}

非工作代码

@Serializable
data class ComanyCustomerLoginData(
val email: String,
val credential: String,
val companyUUID: String = "d80f0b72-a062-11eb-bcbc-0242ac130002",
)
val customerLoginData = ComanyCustomerLoginData("trwla@gmail.com", "1234")
val response = client.post<HttpResponse>(URL) {
contentType(ContentType.Application.Json)
body = customerLoginData
}

在非工作代码中,在数据类构造函数中有一个默认参数,但当它被序列化时,我在json中看不到companyUUID,但工作代码创建了一个名为companyUUID。

你能指出问题出在哪里吗?

默认值不会在kotlinx-serialization:中进行编码

文档中的这个地方描述了如何自定义这种行为:

val format = Json { encodeDefaults = true }

在Ktor中使用此功能的特定情况下,您可以通过以下方式进行自定义:

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

如果通信双方都使用相同的数据模型,那么就不需要这样了。它们既可以正确使用默认值,也可以通过不显式写入来节省带宽。


EDIT:以下是如何在Ktor 2.0:中配置相同的东西

install(ContentNegotiation) {
json(Json {
encodeDefaults = true
})
}

请参阅https://ktor.io/docs/serialization-client.html#register_json

您需要encodeDefaults = true有关的更多信息,请参阅本期

最新更新