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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:05:43