我的用例是,在我使用布尔值作为类型的数据类中,在 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 是一个错误的选择