Android Moshi在浮点值下崩溃
我有这个模型课Android Moshi在浮点值下崩溃,android,json,kotlin,moshi,Android,Json,Kotlin,Moshi,我有这个模型课 data class RvRange(val low: Int?, val high: Int?) 我的JSON响应是 {"low":60799.999999999985,"high":168800.00000000003} 我希望Moshi自动将这些浮点/双精度值转换为Int,但它崩溃了。 这个问题有什么解决方案吗?一个可能的解决方案是创建自己的适配器,在内部将Double转换为Int。例如: object RvRangeAdapter : JsonAdapter<R
data class RvRange(val low: Int?, val high: Int?)
我的JSON响应是
{"low":60799.999999999985,"high":168800.00000000003}
我希望Moshi自动将这些浮点/双精度值转换为Int,但它崩溃了。
这个问题有什么解决方案吗?一个可能的解决方案是创建自己的适配器,在内部将
Double
转换为Int
。例如:
object RvRangeAdapter : JsonAdapter<RvRange>() {
@FromJson
override fun fromJson(reader: JsonReader): RvRange? {
reader.beginObject()
var low: Int? = null
var high: Int? = null
while (reader.hasNext()) {
when (reader.nextName()) {
"low" -> low = reader.nextDouble().roundToInt() // or any other kind of rounding logic
"high" -> high = reader.nextDouble().roundToInt()
else -> reader.skipValue() // let's ignore unknown fields
}
}
reader.endObject()
return RvRange(low, high)
}
@ToJson
override fun toJson(writer: JsonWriter, value: RvRange?) {
writer.beginObject()
.name("low").value(value?.low)
.name("high").value(value?.high)
.endObject()
}
}
解析您提供的JSON时,反序列化值将为:
RvRange(low=60800, high=168800)
请注意,它实际上不适用于
null
值,因此如果null
是“高”和/或“低”的有效值,它将需要更多的调整。为什么不允许它们保持为双精度,然后在需要处理它们时转换为Int?我不想这样做,因为这是一个相当大的代码库,这将是一个很大的变化。
RvRange(low=60800, high=168800)