2017-08-07 73 views
0

enumでモデル化するためにJSONを解析するにはどうすればよいですか?ここでKotlin enumをRetrofitでどのように使用できますか?

は私の列挙型クラスです:

enum class VehicleEnumEntity(val value: String) { 
    CAR("vehicle"), 
    MOTORCYCLE("motorcycle"), 
    VAN("van"), 
    MOTORHOME("motorhome"), 
    OTHER("other") 
} 

と私は列挙

"車両" にtypeを解析する必要があります:{ "データ":{ "タイプ":「車」 "ID": "F9dubDYLYN" }}

EDIT

私はPOJOとそれ常にnull

+0

somethinigを試してみましたか? – lelloman

+0

@lellomanはい、私は標準的な方法を試して、ちょうど私の列挙型をPOJOに渡して、それは常にnullです – Drake

+0

多分それはあなたの質問にそれを言及する価値があります – lelloman

答えて

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

Source

1

別のオプションに私の列挙型を渡す、標準的な方法を試してみました:使用するカスタム(デ)シリアライザーを使用nameの代わりにvalueの列挙型を使用します(デフォルト)。つまり、すべての列挙値に注釈を付ける必要はなく、enumクラスに注釈を付けることができます(またはアダプタを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) 
} 

同じアダプタクラスは、他の列挙型クラスで再利用可能です。

関連する問題