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注解来精确控制哪些字段需要序列化,彻底避开修饰符判断的兼容性问题:
- 给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方法保持不变 }
- 构建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
相关产品推荐
相关产品推荐

