火山引擎后端必须用Moshi解析JSON并显式声明可空类型(如String?、Int?),配置moshi-kotlin-codegen插件,为非空字段设默认值,全局注册NullToStringAdapter以避免null崩溃。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在火山引擎后端服务中,当接口需兼容历史数据或弱约束业务场景时,必须允许部分JSON字段返回null值,否则前端解析会因类型不匹配直接崩溃。
确认Moshi是否已作为默认JSON解析器
检查项目build.gradle中是否已引入Moshi核心库及Kotlin代码生成插件:implementation "com.squareup.moshi:moshi-kotlin:1.15.0" 和 kapt "com.squareup.moshi:moshi-kotlin-codegen:1.15.0"。未配置则后续所有空安全策略均不生效。
若使用的是Jackson或Gson,请立即切换至Moshi——【Moshi是火山引擎官方推荐且唯一深度适配Kotlin空安全的解析器】,其他库无法自动识别String?等可空类型声明。
定义数据类时显式声明可空性
对可能为null的字段,必须用?标记为可空类型,不可依赖默认值覆盖:
✅ 正确写法:val phone: String? = null、val score: Int? = null
❌ 错误写法:val phone: String = ""(后台返回null时仍会抛Moshi.JsonDataException)
基础类型如Int、Boolean、Long必须加?才能接收null;而String等引用类型加?后,Moshi才会跳过该字段或设为null。
为非空字段设置安全默认值
方法一:直接在data class参数中赋默认值
val status: String = "unknown" —— 当JSON中缺失status字段或其值为null时,自动采用此默认值。
方法二:用@Json注解绑定别名并配合默认值
@Json(name = "user_status") val status: String = "inactive" —— 同时解决字段名映射与null兜底问题。
⚠️ 注意:默认值仅对字段缺失或值为null生效;若字段存在但值为"null"字符串,则仍会赋值为该字符串,不会触发默认值逻辑。
全局启用NullSafeAdapter(进阶)
第一步:创建NullToStringAdapter,处理所有String类型字段的null转空字符串
第二步:在Moshi.Builder中注册该适配器:.add(NullToStringAdapter())
第三步:确保该Moshi实例被全局网络层(如OkHttp CallAdapterFactory)统一使用,而非局部new出新实例。
这一步操作起来很简单,直接把文件拖进去就行。但【若未将自定义Adapter注入全局Moshi实例,所有请求仍走默认解析逻辑,null字段依旧崩溃】。


















