LoginSignup
4
8

More than 5 years have passed since last update.

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

Posted at

やりたいこと

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

}

以上

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8