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

Posted

技术标签:

【中文标题】数据类中的默认参数未使用 ktor 序列化程序转换为 json【英文标题】:Default parameter in data class not converted to json using ktor serializer 【发布时间】:2021-07-15 17:00:40 【问题描述】:

在 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 的键。

你能指出是什么问题吗?

【问题讨论】:

当字段等于它们的默认值时,可能只是不序列化,因为它节省了带宽。这可能是可配置的 可能会,会检查。感谢您的意见。 【参考方案1】:

默认值are not encoded默认在kotlinx-serialization

This place in the docs 描述了如何自定义此行为:

val format = Json  encodeDefaults = true 

在 Ktor 中使用 this 的具体情况下,可以这样自定义:

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

如果通信的双方都使用相同的数据模型,那么您应该不需要这个。它们都将正确使用默认值,并通过不显式写入来简单地节省带宽。

【讨论】:

祝福这个家伙【参考方案2】:

你需要encodeDefaults = true 更多信息请见this issue

【讨论】:

以上是关于数据类中的默认参数未使用 ktor 序列化程序转换为 json的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 未看到 Ktor 序列化程序(未找到“用户”类的序列化程序。)

未找到“响应”类的 Ktor 序列化程序

Ktor 客户端的 JsonFeature 未解决

未调用 ktor 中的应用程序级事件

Ktor 应用程序未在使用 IntelliJ IDEA 的 Kotlin 多平台项目中运行

Ktor App 部署到 AppEngine 时未调用 Main 方法