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



JSON API 响应包含以下属性:

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

我正在使用Moshi和ThreeTenBp来解析时间戳,并准备了以下自定义适配器:

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()

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

相关

  • 使用 Moshi 和 Kotlin 的高级 JSON 解析技术
  • 相关项目的在建分支

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

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

相关内容

  • 没有找到相关文章

最新更新