【问题标题】:Moshi crashing at float valuesMoshi 在浮点值上崩溃
【发布时间】:2019-11-11 13:21:48
【问题描述】:

我有这个模型类

data class RvRange(val low: Int?, val high: Int?)

我的 JSON 响应是

{"low":60799.999999999985,"high":168800.00000000003}

我希望 Moshi 自动将这些浮点/双精度值转换为 Int,但它会崩溃。 这个问题有解决办法吗?

【问题讨论】:

  • 为什么不让它们保持 Double 状态,然后在需要对它们执行某些操作时转换为 Int?
  • 我不想这样做,因为它是一个相当大的代码库,而且会发生很大的变化。

标签: android json kotlin moshi


【解决方案1】:

一种可能的解决方案是创建您自己的适配器,在内部将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()
    }
}

完成后,您需要注册该适配器,以便 Moshi 知道它可以使用:

val moshi: Moshi = Moshi.Builder()
        .add(RvRange::class.java, RvRangeAdapter)
        // any other configuration here
        .build() 

解析您提供的 JSON 时,反序列化的值为:

RvRange(low=60800, high=168800)

请注意,它实际上不适用于 null 值,因此如果 null 是“高”和/或“低”的有效值,则需要进行更多调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多