Я использую Kotlin data classes
и GSON
для десериализации схем JSON и реализации значений по умолчанию для защиты от нулевых объектов в JSON.Кроме того, перечисления JSON int соответствуют значениям перечисления Kotlin с использованием аннотации @SerializedName
:
data class Person(@SerializedName("name")
val name: String = ",
@SerializedName("age")
val age: Int = 0,
@SerializedName("hairColor")
val hairColor: Color = Color.NONE)
enum class Color{
@SerializedName("1")
BROWN,
@SerializedName("2")
BLONDE,
NONE
}
Сосредоточение внимания на десериализации перечисления - это хорошо работает в ситуациях, когда поле соответствует известному перечислению или если поле полностью отсутствуетиз JSON, в этом случае будет реализовано перечисление по умолчанию.
НО - если полученное перечисление в JSON не сопоставляется с известным значением перечисления в моем перечислении kotlin - результирующийдесериализованный enum будет нулевым !!
{"name":"Joe","age":10,"hairColor":1} ->
Person(name=Joe, age=10, hairColor=BROWN)
{"name":"Jim"} ->
Person(name=Jim, age=0, hairColor=NONE)
{"name":"Jeff", "age":8,"hairColor":3) ->
Person(name=Jane, age=8, hairColor=null)
Gson обманывает нулевой механизм безопасности Kotlin, присваивая null ненулевому типу.Вопрос - как сопоставить неизвестные JSON-перечисления с глухими Kotlin-перечислениями?Моя цель - поддерживать нулевую безопасность с помощью простой реализации.
PS - я знаю, что могу просто проанализировать перечисления JSON как Ints и десериализовать их позже, или использовать вспомогательные поля и пользовательские геттеры, но мне нравится элегантность исинтаксический анализ типа безопасности непосредственно к перечислениям Kotlin.