在我的项目中,我希望使用gson反序列化具有androidx.compose.ui.graph ics.Color的JSON.我的简化数据类如下所示:

data class Colors(val color: Color)

我想为 colored颜色 类型添加自定义适配器:

fun main() {

    val colors = GsonBuilder()
        .registerTypeAdapter(Color::class.java, ColorAdapter())
        .create()
        .fromJson("{color: \"#FFFFFF\"}", Colors::class.java)

    println(colors)
}

class ColorAdapter : TypeAdapter<Color>() {
    override fun write(out: JsonWriter?, value: Color?) {
        TODO("Not yet implemented")
    }

    override fun read(reader: JsonReader): Color {
        val color = reader.nextString()
        return Color(color.removePrefix("#").toLong(radix = 16))
    }
}

它的读取从未被调用,应用程序因为格式而崩溃,所以我try 了其他方法.要像这样添加适配器

.registerTypeHierarchyAdapter(Long::class.java, ColorAdapter())

在这种情况下,调用了Read,但出现了错误:线程"main"中出现异常com.google.gson.JsonSynaxException:应为Long,但实际为androidx.Compose.ui.graph ics.Color

原因可能是 colored颜色 的内部定义:

@Immutable
@kotlin.jvm.JvmInline
value class Color(val value: ULong)

但无论如何,我没有找到任何解决方案.

问题是,我如何才能在不将字段和适配器更改为使用Long的情况下实现这一点,因为这是我目前唯一的 Select .

推荐答案

同样,为Colors级定义TypeAdapter(或JsonDeserializer)似乎也起到了作用.例如,这是可行的:

package org.example
import androidx.compose.ui.graphics.Color
import com.google.gson.GsonBuilder
import com.google.gson.JsonDeserializationContext
import com.google.gson.JsonDeserializer
import com.google.gson.JsonElement
import java.lang.reflect.Type

data class Colors(val color: Color)

fun main() {

    val colors = GsonBuilder()
        .registerTypeAdapter(Colors::class.java, ColorsAdapter())
        .registerTypeAdapter(Color::class.java, ColorAdapter())
        .create()
        .fromJson("{color: \"#FFFFFF\"}", Colors::class.java)

    println(colors)
}

class ColorsAdapter : JsonDeserializer<Colors> {
    override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Colors {
        return Colors(context.deserialize(json.asJsonObject.get("color"), Color::class.java))
    }
}

class ColorAdapter : JsonDeserializer<Color> {
    override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Color {
        return Color(json.asString.removePrefix("#").toInt(16))
    }
}

Android相关问答推荐

处理Room数据库中的嵌套实体

在不增加父行宽度的情况下添加延迟行或可滚动行

Jetpack编写使用自定义主题覆盖库中主题部分

Android Studio中的Kotlin版本不兼容错误:需要元数据1.9.0,但找到1.6.0

在androidStudio中,如何使用带有ResolutionStrategy的ResolutionSelector而不是setTargetResolve()?

是否可以附加事件处理程序,如onClick,拖动到Canvas Composable中绘制的内容,或使用drawBehind修饰符?

在Jetpack Compose中,我可以配置动画以恒定的速度而不是恒定的时间运行吗?

判断 AAR 元数据时发现 Android 问题:androidx.core:core:1.12.0-alpha01 和 androidx.core:core-ktx:1.12.0-alpha01

Android Studio XML 文本在 ConstraintLayout 中不居中

用作输入参数的 Lambda 函数导致重组

为什么我的应用程序使用这些信息?

未解决的参考:pagerTabIndicatorOffset

在 Kotlin 中设置 startActivity() 时类型不匹配

我该怎么做文本计时器

在移动设备上看到时如何增加 PasswordField 文本?

如何在 Jetpack Compose 中禁用 Horizo​​ntalPager 的分页动画

并行运行两个挂起函数并在第一个返回时返回

在 jetpack compose 中使用 viewmodel 的最佳实践

不能在kotlin的lazycolumn中使用列表

如何使伴奏导航 BottomSheet 完全展开?