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

AndroidX迁移后Release构建GsonBuilder.excludeFieldsWithModifiers失效致POST请求空

解决AndroidX迁移后Gson excludeFieldsWithModifiers失效导致POST请求无参数问题

我之前在项目迁移到AndroidX时也踩过完全一样的坑!本来Release构建下HTTP请求都正常,迁移后GET能跑但POST请求全是空参数,查了半天才发现是Gson的excludeFieldsWithModifiers()方法直接失效,把所有字段都排除了,序列化出来就是个空JSON {}。

问题根源

AndroidX迁移后,旧版本的Gson和AndroidX的类加载环境存在兼容性冲突,导致excludeFieldsWithModifiers()在判断字段修饰符时出现错误——明明只想排除protected和public修饰的字段,结果连private字段也被误判排除了,最终序列化出空字符串,POST请求自然传不了参数。

解决方案

这里有两个靠谱的解决办法,选一个适合你的就行:

方案1:升级Gson到最新兼容版本

直接把项目里的Gson依赖升级到2.9.0及以上的稳定版本,新版本修复了和AndroidX的兼容性问题,excludeFieldsWithModifiers()就能正常工作了。

修改后的测试代码不用动,还是原来的写法:

Person person=new Person();
person.setName("Abc");
person.setUniqueId("abcdef");
Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.PROTECTED, Modifier.PUBLIC).create();
String requestBody = gson.toJson(person);

此时requestBody会正确输出包含uniqueId、name等private字段的JSON。

方案2:改用@Expose注解控制序列化

如果暂时不想升级Gson版本,可以用Gson的@Expose注解来精确控制哪些字段需要序列化,彻底避开修饰符判断的兼容性问题:

  1. 给POJO里需要序列化的private字段加上@Expose注解:
import com.google.gson.annotations.Expose;

public class Person {
    public static final int MAJOR = 0;
    public static final int MINOR = 1;
    @Expose
    private String uniqueId;
    @Expose
    private String name;
    @Expose
    private String nickName;
    @Expose
    private String localUniqueId;
    protected String tempAdrss;
    // getter和setter方法保持不变
}
  1. 构建Gson实例时,开启只序列化带有@Expose注解的字段:
Person person=new Person();
person.setName("Abc");
person.setUniqueId("abcdef");
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
String requestBody = gson.toJson(person);

这种方式更灵活,也不会再受修饰符判断的兼容性问题影响。

内容的提问来源于stack exchange,提问作者Prashant Dange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:59:47