为何Retrofit2中JsonResponse类数组名需与JSON响应数组名一致?
问题原因与解决方案
嘿,这个问题我太熟了!本质是Retrofit默认依赖的Gson解析器,没办法把你修改后的实体类字段和JSON里的数组键对应上,导致解析出来的数组是null,后续用这个null值操作的时候就触发空指针异常了。
为什么改名字就会崩?
- Gson默认的字段匹配规则:Gson解析JSON时,会按照实体类的字段名和JSON键名完全匹配来映射数据。原来你的
JsonResponse类里数组字段叫android,和JSON返回的"android": [...]键名完全一致,所以能正确把数组数据赋值给这个字段;但你改成andr...之后,Gson找不到JSON里对应andr...的键,就会把这个字段设为null。 - 空指针的触发点:当你在代码里把这个null数组传给RecyclerView的Adapter,或者调用它的
size()、遍历操作时,因为对象是null,自然就抛出NullPointerException了。
怎么解决?
最常用的两种方法,按需选择:
方法1:用@SerializedName注解指定映射关系(推荐)
这是最灵活的方式,不管你把实体类字段改成啥名字,只要用注解指定它对应的JSON键名就行。比如:
public class JsonResponse { // 注解里的value写JSON里实际的数组键名"android" @SerializedName("android") private List<YourDataModel> andr; // 你修改后的字段名 // 记得加getter方法,方便后续获取数据 public List<YourDataModel> getAndr() { return andr; } }
这样Gson就明确知道要把JSON里的android数组,映射到你类里的andr字段,解析就不会出错了。
方法2:自定义Gson的字段命名策略(适合全局统一规则)
如果你整个项目的实体类字段名和JSON键名有统一的命名差异(比如驼峰转下划线),可以自定义Gson实例传给Retrofit,不用每个字段加注解:
// 自定义Gson实例,设置字段命名策略 Gson customGson = new GsonBuilder() // 比如把实体类的驼峰字段,映射到JSON的下划线键名(示例,按需调整) .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .create(); // 创建Retrofit时用这个自定义Gson Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create(customGson)) .build();
不过这个是全局生效的,单个字段修改还是用注解更精准。
额外注意点
- 混淆配置:如果你的项目开启了ProGuard混淆,记得给
JsonResponse这类实体类添加混淆规则,避免字段名被混淆导致Gson无法匹配:-keep class com.yourpackage.models.JsonResponse { *; } -keep class com.yourpackage.models.YourDataModel { *; } - 调试技巧:可以在解析后打印
JsonResponse对象的数组字段,确认是不是null;也可以先用Postman等工具确认后端返回的JSON结构有没有变化,排除后端的问题。
内容的提问来源于stack exchange,提问作者Bissi singh
相关产品推荐
相关产品推荐

