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扩展库,步骤如下:
- 在你的
build.gradle(Module级别)中添加依赖:
dependencies { implementation 'com.google.gson:gson:2.10.1' implementation 'com.google.gson:gson-kotlin-extensions:2.10.1' }
- 创建带Kotlin适配器的Gson实例:
val gson = GsonBuilder() .registerTypeAdapterFactory(KotlinAdapterFactory()) .create()
- 在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支持更友好),只需要两步:
- 给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 )
- 确保Retrofit使用Moshi转换器:
val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(MoshiConverterFactory.create()) .build()
Moshi会自动识别Kotlin的默认参数,isPlaying会被正确初始化为true。
注意:如果你的isPlaying字段需要在应用逻辑中修改,一定要用var而不是val,否则后续无法更改它的值。
内容的提问来源于stack exchange,提问作者Sundeep1501
相关产品推荐
相关产品推荐

