Kotlin中Retrofit响应枚举使用问题:下划线值解析失败
Retrofit枚举带下划线值解析失败的解决办法
问题根源
你遇到的问题是因为Retrofit默认使用的JSON解析库(比如Gson),默认会把枚举常量的名称和接口返回的字符串做精准匹配。但接口返回的door_open带下划线,而Kotlin/Java的枚举常量名称不能包含下划线,你没法定义一个叫door_open的枚举常量,自然匹配失败返回null;而close能正常工作,应该是你枚举里刚好有个同名的常量(比如close)。
最简单的解决方法:用注解绑定枚举与返回值
直接给枚举类的每个常量添加@SerializedName注解,显式指定它对应的接口返回字符串,示例代码如下:
修正后的DoorStatus枚举
import com.google.gson.annotations.SerializedName enum class DoorStatus { @SerializedName("close") Close, // 绑定接口返回的"door_open"到枚举常量DoorOpen @SerializedName("door_open") DoorOpen }
对应的LockStatus枚举(保持一致性)
import com.google.gson.annotations.SerializedName enum class LockStatus { @SerializedName("Unlocked") Unlocked, @SerializedName("Locked") Locked }
额外说明
如果你的Retrofit用的是Moshi而不是Gson,只需要把@SerializedName换成Moshi的@Json注解即可,逻辑完全一样。
这样配置后,不管接口返回的字符串是下划线格式还是其他格式,都能精准映射到对应的枚举常量,调用doorStatus.name就能正常获取枚举常量的名称(比如DoorOpen),不会再返回null。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

