JSONを解析して列挙型でモデル化するにはどうすればよいですか?
これが私の列挙型クラスです:
enum class VehicleEnumEntity(val value: String) {
CAR("vehicle"),
MOTORCYCLE("motorcycle"),
VAN("van"),
MOTORHOME("motorhome"),
OTHER("other")
}
type
を解析して列挙型にする必要があります
"vehicle":{"data":{"type": "vehicle"、 "id": "F9dubDYLYN"}}
[〜#〜]編集[〜#〜]
私は標準的な方法を試しましたが、列挙型をPOJOに渡すだけで常にnullになります
enum class VehicleEnumEntity(val value: String) {
@SerializedName("vehicle")
CAR("vehicle"),
@SerializedName("motorcycle")
MOTORCYCLE("motorcycle"),
@SerializedName("van")
VAN("van"),
@SerializedName("motorhome")
MOTORHOME("motorhome"),
@SerializedName("other")
OTHER("other")
}
別のオプション:value
(デフォルト)の代わりに、列挙型のname
を使用するカスタム(デ)シリアライザーを使用します。つまり、すべての列挙値に注釈を付ける必要はありませんが、代わりに列挙クラスに注釈を付けることができます(またはGsonBuilder
にアダプターを追加します)。
interface HasValue {
val value: String
}
@JsonAdapter(EnumByValueAdapter::class)
enum class VehicleEnumEntity(override val value: String): HasValue {
CAR("vehicle"),
MOTORCYCLE("motorcycle"),
VAN("van"),
MOTORHOME("motorhome"),
OTHER("other")
}
class EnumByValueAdapter<T> : JsonDeserializer<T>, JsonSerializer<T>
where T : Enum<T>, T : HasValue {
private var values: Map<String, T>? = null
override fun deserialize(
json: JsonElement, type: Type, context: JsonDeserializationContext
): T? =
(values ?: @Suppress("UNCHECKED_CAST") (type as Class<T>).enumConstants
.associateBy { it.value }.also { values = it })[json.asString]
override fun serialize(
src: T, type: Type, context: JsonSerializationContext
): JsonElement = JsonPrimitive(src.value)
}
同じアダプタークラスを他の列挙型クラスで再利用できます。