LoginSignup
6
5

More than 5 years have passed since last update.

Retrofit2+GsonでJsonの形式が配列になったりオブジェクトになったりする時に対応する方法

Last updated at Posted at 2017-03-23

レスポンスの形式

{
   "val":[]
}
{
   "val":{
      "val1":1,
      "val1":2
   }
}

こんな風に同じキーでも配列とかオブジェクトになったりするとき。

class Response{
    @SerializedName("val")
    val val<Val>? = null
}

っていうモデルだとうまくいかない。形式が異なるのでエラーになる。
そこでJsonDeserializerを使う。

以下のようにjsonMappingのタイミングでリマップする。

class ValRequestDeserializer:JsonDeserializer<Response>{
  override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): Response {

          // ここでjsonが配列かオブジェクトか判定して配列にリマップする
          return context!!.deserialize(json, Response::class.java)
      }
      return Gson().fromJson(json, Response::class.java)
  }
}

これを以下のようにセットする。

val gson = GsonBuilder()
  .setDateFormat("yyyy-MM-dd'T'HH:mm:ss")
  .registerTypeAdapter(Response::class.java, ValRequestDeserializer())
  .create()

なんかもっといいやり方ありそうだが、今はこれしか知らない・・・・

まぁそもそもこんな実装必要なAPIやめてくれってのはもはや言うまい。いろいろな事情があるのだ、いろいろな

6
5
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
6
5