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

Retrofit实体类添加自定义字段后默认值被置空的问题咨询

解决Retrofit实体类自定义字段被设为null的问题

这个问题我之前帮好几个开发者踩过坑,本质是Retrofit默认用的JSON解析库(比如Gson)的行为逻辑导致的:当API响应里没有isChecked这个字段时,解析器不会保留你设置的默认值false,反而会把它设为null(如果你的字段是包装类型的话)。下面给你几个实用的解决方案:

1. 改用基本类型(最快捷)

如果你的业务逻辑不需要null状态,直接把isChecked的类型从包装类Boolean改成基本类型boolean:

// Java 实体类
public class YourApiEntity {
    // API 返回的字段
    private String id;
    private String title;
    // 自定义字段,用基本类型并设置默认值
    private boolean isChecked = false;

    // getter & setter 略
}

基本类型boolean在Java里默认值就是false,而且Gson不会把它改成null(基本类型不允许为null),完美解决你的问题。

如果是Kotlin的话更简单,直接给字段设置默认值:

// Kotlin 数据类
data class YourApiEntity(
    val id: String,
    val title: String,
    // 自定义字段默认设为false
    val isChecked: Boolean = false
)

不过要注意,如果你用的是Gson解析Kotlin数据类,建议确保你的Gson版本支持Kotlin默认值(一般新版都支持),或者改用kotlinx.serialization作为转换器。

2. 自定义JSON解析适配器(适合必须用包装类的场景)

如果你的业务需要isChecked支持null状态,但又希望解析时默认设为false,可以给Gson写一个自定义的TypeAdapter:

public class BooleanDefaultAdapter extends TypeAdapter<Boolean> {
    @Override
    public void write(JsonWriter out, Boolean value) throws IOException {
        out.value(value);
    }

    @Override
    public Boolean read(JsonReader in) throws IOException {
        JsonToken token = in.peek();
        // 如果JSON里没有这个字段或者值为null,返回默认值false
        if (token == JsonToken.NULL) {
            in.nextNull();
            return false;
        }
        return in.nextBoolean();
    }
}

然后在创建Retrofit实例时,把这个适配器注册到Gson里:

Gson customGson = new GsonBuilder()
        .registerTypeAdapter(Boolean.class, new BooleanDefaultAdapter())
        .create();

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("你的API地址")
        .addConverterFactory(GsonConverterFactory.create(customGson))
        .build();

这样所有Boolean类型的字段,如果API响应里没有,都会被自动设为false。

3. 构造方法手动初始化(兼容旧版解析库)

如果不想改类型也不想写适配器,还可以在实体类的无参构造方法里手动给isChecked赋值:

public class YourApiEntity {
    private String id;
    private String title;
    private Boolean isChecked;

    // 无参构造方法里手动初始化
    public YourApiEntity() {
        this.isChecked = false;
    }

    // getter & setter 略
}

Gson在解析时,如果JSON里没有对应字段,不会去修改这个值,所以构造方法里的默认值会被保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:22:37