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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:35:32