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
相关产品推荐
相关产品推荐

