Android Moshi 无法应用自定义适配器

问题描述 投票:0回答:0

我的用例是,在我使用布尔值作为类型的数据类中,在 JSON 中可以是双引号字符串(“true”)或普通布尔值(true)
早些时候我使用的是 Gson,它曾经自动处理所有这些情况,但是当我尝试迁移到 moshi 时,我遇到了多个问题。我什至为它写了自定义适配器

class BooleanAdapter : JsonAdapter<Boolean>() {
    @FromJson
    override fun fromJson(reader: JsonReader): Boolean {
        return when (reader.peek()) {
            JsonReader.Token.BOOLEAN -> reader.nextBoolean()
            JsonReader.Token.STRING -> {
                when (val value = reader.nextString()) {
                    "true", "True", "TRUE", "1" -> true
                    "false", "False", "FALSE", "0" -> false
                    else -> throw JsonDataException("Invalid boolean value: $value")
                }
            }
            JsonReader.Token.NUMBER -> {
                when (val value = reader.nextInt()) {
                    0 -> false
                    1 -> true
                    else -> throw JsonDataException("Invalid boolean value: $value")
                }
            }
            else -> throw JsonDataException("Expected boolean or string or int value but was ${reader.peek()}")
        }
    }

    @ToJson
    override fun toJson(writer: JsonWriter, value: Boolean?) {
        writer.value(value)
    }
}

然后用这个在retrofit中注入Moshi

@Singleton
@Provides
@MoshiBuilder
fun providesDeserializer(): Moshi =
    Moshi.Builder()
        .add(BooleanAdapter())
        .build()

这是一个示例数据类

@JsonClass(generateAdapter = true)
data class ItemResponse(

    @field:JsonAdapter(BooleanAdapter::class)
    @Json(name = "mSet") val IsSet: Boolean,

    @Json(name = "name") val name: String,

    @field:JsonAdapter(BooleanAdapter::class)
    @Json(name = "isPrimary") val isPrimary: Boolean
)

出现以下错误

com.squareup.moshi.JsonDataException: Expected a boolean but was STRING at path

在 JSON 中,此参数为“true”
我在这里错过了什么。看来我迁移到 Moshi 是一个错误的选择

android android-json moshi
© www.soinside.com 2019 - 2024. All rights reserved.