Kotlin中如何将API响应的status字段转换为带属性的密封类?
实现密封类Status与JSON字段的映射(Gson/Moshi方案)
给定API响应JSON:
{ "id": 45, "name": "Bill", "status": "Alive" }
以及目标密封类:
import androidx.compose.ui.graphics.Color // 根据实际使用的Color类调整 sealed class Status(val color: Color) { object Alive : Status(Color.Green) object Dead : Status(Color.Red) object Unknown : Status(Color.Gray) }
以下是用Gson和Moshi实现字符串到密封类实例映射的具体方法:
Gson 实现
Gson需要自定义TypeAdapter来处理字符串与密封类单例的转换:
1. 编写自定义TypeAdapter
import com.google.gson.TypeAdapter import com.google.gson.stream.JsonReader import com.google.gson.stream.JsonWriter class StatusTypeAdapter : TypeAdapter<Status>() { // 序列化:把Status对象转成JSON字符串 override fun write(out: JsonWriter, value: Status?) { val statusStr = when (value) { is Status.Alive -> "Alive" is Status.Dead -> "Dead" is Status.Unknown -> "Unknown" null -> "Unknown" // 可选:处理null值 } out.value(statusStr) } // 反序列化:把JSON字符串转成Status实例 override fun read(`in`: JsonReader): Status { return when (`in`.nextString()) { "Alive" -> Status.Alive "Dead" -> Status.Dead else -> Status.Unknown // 未知字符串默认映射为Unknown } } }
2. 注册适配器并解析JSON
import com.google.gson.Gson import com.google.gson.GsonBuilder // 定义对应API响应的数据类 data class Person( val id: Int, val name: String, val status: Status ) fun parsePersonWithGson(json: String) { val gson = GsonBuilder() .registerTypeAdapter(Status::class.java, StatusTypeAdapter()) .create() val person = gson.fromJson(json, Person::class.java) println("Status color: ${person.status.color}") // 输出Color.Green }
Moshi 实现
Moshi通过自定义JsonAdapter(配合注解)实现转换,更简洁:
1. 编写自定义JsonAdapter
import com.squareup.moshi.FromJson import com.squareup.moshi.ToJson class StatusAdapter { // 反序列化:字符串转Status @FromJson fun fromJson(statusStr: String): Status { return when (statusStr) { "Alive" -> Status.Alive "Dead" -> Status.Dead else -> Status.Unknown } } // 序列化:Status转字符串 @ToJson fun toJson(status: Status): String { return when (status) { is Status.Alive -> "Alive" is Status.Dead -> "Dead" is Status.Unknown -> "Unknown" } } }
2. 注册适配器并解析JSON
import com.squareup.moshi.Moshi import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory data class Person( val id: Int, val name: String, val status: Status ) fun parsePersonWithMoshi(json: String) { val moshi = Moshi.Builder() .add(StatusAdapter()) .add(KotlinJsonAdapterFactory()) // 必须添加,支持Kotlin数据类和密封类 .build() val personAdapter = moshi.adapter(Person::class.java) val person = personAdapter.fromJson(json) println("Status color: ${person?.status?.color}") // 输出Color.Green }
内容的提问来源于stack exchange,提问作者Eduardo Martins
相关产品推荐
相关产品推荐

