如何使用 Moshi 同时解析时间戳和时区偏移量?

How to parse time stamp and time zone offset simultaneously with Moshi?

提问人:JJD 提问时间:12/8/2019 更新时间:12/9/2019 访问量:788

问:

JSON-API-响应包含以下属性:

created_at_timestamp: 1565979486,
timezone: "+01:00",

我正在使用 MoshiThreeTenBp 来解析时间戳并准备以下自定义适配器:

class ZonedDateTimeAdapter {

    @FromJson
    fun fromJson(jsonValue: Long?) = jsonValue?.let {
        try {
            ZonedDateTime.ofInstant(Instant.ofEpochSecond(jsonValue), ZoneOffset.UTC) // <---
        } catch (e: DateTimeParseException) {
            println(e.message)
            null
        }
    }

}

正如你所看到的,区域偏移在这里是硬编码的。

class ZonedDateTimeJsonAdapter : JsonAdapter<ZonedDateTime>() {

    private val delegate = ZonedDateTimeAdapter()

    override fun fromJson(reader: JsonReader): ZonedDateTime? {
        val jsonValue = reader.nextLong()
        return delegate.fromJson(jsonValue)
    }

}

...

class ZoneOffsetAdapter {

    @FromJson
    fun fromJson(jsonValue: String?) = jsonValue?.let {
        try {
            ZoneOffset.of(jsonValue)
        } catch (e: DateTimeException) {
            println(e.message)
            null
        }
    }

}

...

class ZoneOffsetJsonAdapter : JsonAdapter<ZoneOffset>() {

    private val delegate = ZoneOffsetAdapter()

    override fun fromJson(reader: JsonReader): ZoneOffset? {
        val jsonValue = reader.nextString()
        return delegate.fromJson(jsonValue)
    }

}

适配器的注册方式如下:Moshi

Moshi.Builder()
    .add(ZoneOffset::class.java, ZoneOffsetJsonAdapter())
    .add(ZonedDateTime::class.java, ZonedDateTimeJsonAdapter())
    .build()

解析各个字段 (, ) 工作正常。但是,我想摆脱硬编码的区域偏移量。如何将 Moshi 配置为在解析属性时回退到属性。created_at_timestamptimezonetimezonecreated_at_timestamp

相关

Kotlin 时区偏移量 Moshi ThreeTenBP

评论


答:

2赞 Jesse Wilson 12/8/2019 #1

对于字段,应使用没有时区的类型。这通常是.它标识一个时刻,而与它被解释在哪个时区无关。created_at_timestampInstant

然后,在封闭类型中,您可以定义一个 getter 方法,将 instant 和 zone 合并为一个值。该方法可以做到这一点。ZonedDateTime.ofInstant

评论

0赞 JJD 12/9/2019
谢谢!这是一个完美的提示。我根据您的建议更改了实现,对其进行了测试并更新了分支。