Как узнать стоимость модификации enum throw? - PullRequest
0 голосов
/ 06 марта 2019

У меня есть перечисление некоторых значений, называемое Counter

enum class Counter{
    none,
    few,
    many
}

И я хочу получить значение этого перечисления в моей модели, используя модификацию, поэтому я создал объект

data class Test(
        var param1: String?,
        var param2: String?,
        var counter: Counter?,
)

Но когда я использую подобную модель для своего метода Retrofit, я получаю только param1 и param 2, хотя мой сервер получает ответ {"param1": "String1", "param2": "String2", "counter": "many"}

Как получить значение counter, don 'т в модели var counter: String??

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Создайте свой enum вот так

enum class Counter{
    @SerializedName("none")
    none("none"),

    @SerializedName("few")
    few("few"),

    @SerializedName("many")
    many("many")
}
0 голосов
/ 06 марта 2019

Вы можете использовать JsonDeserializer для пользовательской десериализации своих сетевых вызовов.

class TestDeserializer: JsonDeserializer<Test> {

    override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Test {
        val obj = json.asJsonObject

        val param1 = obj.get("param1")?.asString
        val param2 = obj.get("param2")?.asString

        val counter = when(obj.get("counter")?.asString) {
            "none" -> Counter.none
            "few" -> Counter.few
            "many" -> Counter.many
            else -> throw IllegalArgumentException("Counter type unknown.")
        }

        return Test(param1, param2, counter)
    }
}

И вам просто нужно зарегистрировать его при создании клиента Retrofit.

val gson = GsonBuilder()
        .registerTypeAdapter(Test::class.java, TestDeserializer())
        .create()

return Retrofit.Builder()
        .baseUrl(BASE_URL)
        .client(client)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...