Posted at

MoshiでDate型をjson変換するときのカスタムアダプター


やりたいこと

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になってしまい、これを任意のパターンに変換したい。

参考:moshi/adapters

※本記事ではkotlinで説明します


実現方法


結論

カスタマイズしたJsonAdapter(DateJsonAdapter)を実装して、以下のようにMoshiのビルダーにアダプターを加える。

val moshi = Moshi.Builder().add(Date::class.java, DateJsonAdapter()).build()


DateJsonAdapterの実装

以下は、 Dateyyyy/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))
}

}

以上