以下のようにFruit enumを持つ、PersonというデータクラスをGsonでjson文字列に変換する例を考えます。
enum class Fruit(val value: String) {
appleKey("appleValue"),
bananaKey("bananaValue");
}
data class Person(val name: String, val favoriteFruit: Fruit) {
}
単純に変換すると次のようになります。
val jsonString = Gson().toJson(person);
Log.d(TAG, "${jsonString}")
// 出力
// {"favoriteFruit":"appleKey","name":"Jack"}
favoriteFruitに appleKey
とenumのキーの値が文字列で入ってきています。
これで良ければ良いのですが、enumの値の方(appleValue)に変換してjsonを出力したいことが多いです。
以下のようにSerializerを登録することで実現できます。
val jsonString = GsonBuilder()
.registerTypeAdapter(Fruit::class.java, object : JsonSerializer<Fruit> {
override fun serialize(src: Fruit?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement {
src?.let {
return JsonPrimitive(it.value)
}
return JsonNull.INSTANCE
}
})
.create()
.toJson(person)
Log.d(TAG, "${jsonString}")
//出力
//{"favoriteFruit":"appleValue","name":"Jack"}
enumの値 appleValue
を使ってjson文字列を作成することができました。