You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中Retrofit映射Kotlin类时自定义默认字段失效求助

解决Retrofit+Kotlin中Ticket类isPlaying默认值不生效的问题

这个问题我之前开发Android时也碰到过!核心原因是Retrofit依赖的序列化库(比如Gson)在解析JSON时,不会自动识别你添加的本地逻辑字段的默认值——因为JSON里根本没有isPlaying这个字段,Kotlin中Boolean类型的默认值又是false,所以才会出现你看到的始终为false的情况。下面给你几种靠谱的解决办法:

方法一:给Ticket类添加无参构造函数(适配Gson默认配置)

如果你的项目用的是默认的Gson转换器,最简单的方式是给Ticket类加一个无参构造函数,在里面手动初始化isPlaying为true:

class Ticket(
    val ticket_id: Long,
    val rows: List<Row>,
    var isPlaying: Boolean = true // 设为var方便后续修改逻辑值
) {
    // 供Gson反序列化调用的无参构造
    constructor() : this(0L, emptyList(), true)
}

Gson在解析JSON时会优先调用无参构造,这样isPlaying就会被初始化为true了。

方法二:启用Gson的Kotlin扩展支持(更优雅的方式)

如果你想让Gson直接识别Kotlin的默认参数,可以引入Gson的Kotlin扩展库,步骤如下:

  1. 在你的build.gradle(Module级别)中添加依赖:
dependencies {
    implementation 'com.google.gson:gson:2.10.1'
    implementation 'com.google.gson:gson-kotlin-extensions:2.10.1'
}
  1. 创建带Kotlin适配器的Gson实例:
val gson = GsonBuilder()
    .registerTypeAdapterFactory(KotlinAdapterFactory())
    .create()
  1. 在Retrofit初始化时使用这个Gson实例:
val retrofit = Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build()

这样你的Ticket类不需要额外加无参构造,直接保留默认值即可:

class Ticket(
    val ticket_id: Long,
    val rows: List<Row>,
    var isPlaying: Boolean = true
)

方法三:如果用Moshi作为序列化库(推荐新项目使用)

如果你的项目用的是Moshi(现在很多Android新项目会选择它,对Kotlin支持更友好),只需要两步:

  1. 给Ticket类添加@JsonClass注解,让Moshi生成适配器:
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
class Ticket(
    val ticket_id: Long,
    val rows: List<Row>,
    var isPlaying: Boolean = true
)
  1. 确保Retrofit使用Moshi转换器:
val retrofit = Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(MoshiConverterFactory.create())
    .build()

Moshi会自动识别Kotlin的默认参数,isPlaying会被正确初始化为true。

注意:如果你的isPlaying字段需要在应用逻辑中修改,一定要用var而不是val,否则后续无法更改它的值。

内容的提问来源于stack exchange,提问作者Sundeep1501

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:40:52