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

Kotlin使用Moshi+Retrofit解析JSON报必填值缺失错误如何解决

问题产生原因

报错的核心原因有两个,完全匹配你贴出的代码和异常栈信息:

  1. 你的WeatherDTO类上的@JsonClass注解漏写了@前缀,注解未生效。你贴出的代码中该类头部写的是JsonClass(generateAdapter = true),没有@标记的话这行代码根本不会被识别为注解,Moshi不会为该类生成自定义适配器,会直接按照字段名weatherData去JSON根节点查找同名键,自然找不到,直接触发缺失字段异常。
  2. 大概率你在初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:15:41