やりたいこと
Moshiを使ってjson変換するとき、Date
型を任意のパターン(例えばyyyy/MM/dd HH:mm:ss
)に変換したい。
ちなみにjsonに変換したいクラスのメンバにDate型があり、Moshiのアダプターに何も設定しないと、以下のエラーが出ました。
java.lang.RuntimeException: Unable to create application xxxxxx: java.lang.IllegalArgumentException: Platform class java.util.Date (with no annotations) requires explicit JsonAdapter to be registered
プリミティブ型以外はアダプターが必要そうな。
ただMoshiが提供しているRfc3339DateJsonAdapter
アダプターを使うと 2015-09-26T18:23:50.250Z
みたいなStringになってしまい、これを任意のパターンに変換したい。
※本記事ではkotlinで説明します
実現方法
結論
カスタマイズしたJsonAdapter(DateJsonAdapter)を実装して、以下のようにMoshiのビルダーにアダプターを加える。
val moshi = Moshi.Builder().add(Date::class.java, DateJsonAdapter()).build()
DateJsonAdapterの実装
以下は、 Date
をyyyy/MM/dd HH:mm:ss
に変換する場合です。
参考 : Rfc3339DateJsonAdapter.java
import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.JsonReader
import com.squareup.moshi.JsonWriter
import java.text.SimpleDateFormat
import java.util.*
class DateJsonAdapter: JsonAdapter<Date>() {
private val dateFormat = "yyyy/MM/dd HH:mm:ss"
private val sdFormat = SimpleDateFormat(dateFormat, Locale.JAPAN)
@Synchronized
@Throws(Exception::class)
override fun fromJson(reader: JsonReader): Date {
val string = reader.nextString()
return sdFormat.parse(string)
}
@Synchronized
@Throws(Exception::class)
override fun toJson(writer: JsonWriter, value: Date?) {
writer.value(sdFormat.format(value))
}
}
以上