Kotlin使用Moshi+Retrofit解析JSON报必填值缺失错误如何解决
问题产生原因
报错的核心原因有两个,完全匹配你贴出的代码和异常栈信息:
- 你的
WeatherDTO类上的@JsonClass注解漏写了@前缀,注解未生效。你贴出的代码中该类头部写的是JsonClass(generateAdapter = true),没有@标记的话这行代码根本不会被识别为注解,Moshi不会为该类生成自定义适配器,会直接按照字段名weatherData去JSON根节点查找同名键,自然找不到,直接触发缺失字段异常。 - 大概率你在初始化Moshi/Retrofit时没有注册
KotlinJsonAdapterFactory,这是Moshi适配Kotlin数据类、非空类型、字段注解映射的必要组件,缺失该配置会导致注解规则不生效、非空类型校验异常等问题。
修复方法
按以下步骤逐一修改即可解决问题:
- 补全
WeatherDTO类上缺失的注解前缀,修正后代码如下:
@JsonClass(generateAdapter = true) // 补上缺失的@前缀 data class WeatherDTO( @field:Json(name = "hourly") val weatherData: WeatherDataDTO )
- 修正Moshi与Retrofit初始化逻辑,必须给Moshi实例注册
KotlinJsonAdapterFactory,参考正确实现:
// 初始化Moshi实例 val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory()) // 核心配置,不可遗漏 .build() // 初始化Retrofit时传入配置完成的Moshi对象 val retrofit = Retrofit.Builder() .baseUrl("替换为你的接口基地址") .addConverterFactory(MoshiConverterFactory.create(moshi)) .build()
- 可选兜底配置:如果接口存在偶发返回null、字段缺失的情况,可以给DTO字段添加可空标记和默认值,避免非空校验触发崩溃,示例:
@JsonClass(generateAdapter = true) data class WeatherDTO( @field:Json(name = "hourly") val weatherData: WeatherDataDTO? = null )
内容的提问来源于stack exchange,提问作者Tonnie
相关产品推荐
相关产品推荐

