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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:53:47