Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Moshi在浮点值下崩溃_Android_Json_Kotlin_Moshi - Fatal编程技术网

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)