Я пытаюсь проанализировать json ответ, который включает перечисление, используя библиотеку Klaxon и kotlin. Ниже тест. Если у меня есть nullable enum, мой анализ не удастся. Есть ли способ сделать это правильно? Это проблема с библиотекой Клаксона?
import com.beust.klaxon.Klaxon
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertNull
enum class MyEnum { FIRST, SECOND, THIRD }
class WithEnum {
var myVal: MyEnum? = null
}
class EnumTest {
@Test
fun `should deserialize null enum`() {
val parsed = Klaxon().parse<WithEnum>("{ \"myVal\":null}")
assertNotNull(parsed)
assertNull(parsed.myVal)
}
@Test
fun `should deserialize proper enum`() {
val parsed = Klaxon().parse<WithEnum>("{ \"myVal\":\"FIRST\"}")
assertNotNull(parsed)
assertEquals(MyEnum.FIRST, parsed.myVal)
}
}
Ответ от вышеупомянутого модульного теста:
kotlin.TypeCastException: null cannot be cast to non-null type kotlin.String
at com.beust.klaxon.EnumConverter.fromJson(EnumConverter.kt:23)
at com.beust.klaxon.EnumConverter.fromJson(EnumConverter.kt:6)
at com.beust.klaxon.JsonObjectConverter.retrieveKeyValues(JsonObjectConverter.kt:189)
at com.beust.klaxon.JsonObjectConverter.initIntoUserClass(JsonObjectConverter.kt:67)
at com.beust.klaxon.JsonObjectConverter.fromJson(JsonObjectConverter.kt:32)
at com.beust.klaxon.DefaultConverter.fromJsonObject(DefaultConverter.kt:210)
at com.beust.klaxon.DefaultConverter.fromJson(DefaultConverter.kt:32)
at com.beust.klaxon.Klaxon.fromJsonObject(Klaxon.kt:296)
at EnumTest.should deserialize null enum(EnumTest.kt:30)
...
Там источником ошибки является https://github.com/cbeust/klaxon/blob/master/klaxon/src/main/kotlin/com/beust/klaxon/EnumConverter.kt#L23, где ноль приводится к Строка.