Android中使用Retrofit发送@Body时如何剔除null字段?
Retrofit发送Body时去除Null字段的解决方案
针对你遇到的问题,核心是让JSON序列化工具忽略null值,同时满足Types类中id和name互斥发送的需求,以下是几种可行的实现方式:
方法一:全局配置Gson忽略Null字段
Retrofit默认使用Gson作为JSON序列化工具,你可以创建一个配置好的Gson实例,让它自动排除所有null字段,再将其传入Retrofit构建器:
// 创建配置好的Gson实例 Gson gson = new GsonBuilder() .excludeFieldsWithNullValues() .create(); // 构建Retrofit时使用该Gson Retrofit retrofit = new Retrofit.Builder() .baseUrl("你的接口地址") .addConverterFactory(GsonConverterFactory.create(gson)) .build();
这样所有通过@Body发送的实体类,只要字段为null,都会被自动排除在JSON之外。
方法二:给实体类添加注解精准控制
如果不想全局配置,只想针对Types类生效,可以在类或字段上添加@JsonInclude注解:
类级别配置(整个Types类的null字段都忽略)
public class BodyUserData { private List<Types> types; @JsonInclude(JsonInclude.Include.NON_NULL) public static class Types { private String id; private String name; // getter、setter或构造方法 } }
字段级别配置(单独控制某个字段)
如果需要更细粒度的控制,比如只忽略id或name的null值,可以直接在字段上加注解:
public static class Types { @JsonInclude(JsonInclude.Include.NON_NULL) private String id; @JsonInclude(JsonInclude.Include.NON_NULL) private String name; }
方法三:自定义TypeAdapter实现互斥逻辑
如果你的需求是严格的「id有值只发id,name有值只发name」(即使两者都有值也只保留一个),可以自定义Gson的TypeAdapter来实现精准控制:
public class TypesAdapter extends TypeAdapter<Types> { @Override public void write(JsonWriter out, Types value) throws IOException { out.beginObject(); if (value.getId() != null) { out.name("id").value(value.getId()); } else if (value.getName() != null) { out.name("name").value(value.getName()); } out.endObject(); } @Override public Types read(JsonReader in) throws IOException { // 反序列化逻辑,按需实现 Types types = new Types(); in.beginObject(); while (in.hasNext()) { switch (in.nextName()) { case "id": types.setId(in.nextString()); break; case "name": types.setName(in.nextString()); break; } } in.endObject(); return types; } }
然后将这个Adapter注册到Gson中:
Gson gson = new GsonBuilder() .registerTypeAdapter(Types.class, new TypesAdapter()) .create();
这样序列化Types对象时,就会严格按照你需要的逻辑生成JSON。
内容的提问来源于stack exchange,提问作者Dr.KeyOk
相关产品推荐
相关产品推荐

