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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:57:42