Android中含可选参数的Retrofit Data Class配置问题
解决Android Retrofit中带可选参数的Data Class序列化问题
问题核心
你遇到两个关键问题:
- 调用
Status(power=1)时报错,是因为Kotlin Data Class参数未设置默认值,必须显式传入所有参数; - 未传入的参数被序列化,需要让Gson忽略值为null的字段。
解决方案
1. 给Data Class参数添加默认值
修改Status类,为每个可选参数设置默认值null,这样就能只传入需要的参数:
import com.google.gson.annotations.SerializedName data class Status( @field:SerializedName("power") val power: Int? = null, @field:SerializedName("state") val state: Int? = null )
现在可以正常使用以下三种调用方式:
Status(power=1)Status(state=45)Status(power=1, state=45)
2. 配置Gson忽略Null字段
要让未传入的参数(值为null的字段)不被序列化,有两种实现方式:
方式一:全局配置Gson实例
创建Retrofit时,自定义Gson实例并设置忽略null值:
import com.google.gson.Gson import com.google.gson.GsonBuilder import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory // 自定义Gson实例 val gson = GsonBuilder() .serializeNulls(false) // 默认即为false,显式声明更清晰 .create() // 构建Retrofit val retrofit = Retrofit.Builder() .baseUrl("你的BaseUrl") .addConverterFactory(GsonConverterFactory.create(gson)) .build()
方式二:单独给Data Class添加注解
如果不想全局修改Gson配置,可给Status类添加@JsonInclude注解,指定仅序列化非null字段:
import com.google.gson.annotations.JsonInclude import com.google.gson.annotations.SerializedName @JsonInclude(JsonInclude.Include.NON_NULL) data class Status( @field:SerializedName("power") val power: Int? = null, @field:SerializedName("state") val state: Int? = null )
效果验证
完成上述修改后,Gson序列化结果将完全符合预期:
- 调用
Status(power=1)时,输出:{ "power": 1 } - 调用
Status(state=45)时,输出:{ "state": 45 } - 调用
Status(power=1, state=45)时,输出:{ "power": 1, "state": 45 }
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

