Kotlin Klaxon解析空枚举

Kotlin Klaxon解析空枚举,kotlin,enums,klaxon,Kotlin,Enums,Klaxon,我正在尝试使用Klaxon库和kotlin解析包含枚举的json响应。下面是一个测试。如果我有一个可为空的枚举,我的解析就会失败。有没有办法做到这一点?这是克拉克森图书馆的问题吗 import com.beust.klaxon.Klaxon import org.junit.jupiter.api.Test import kotlin.test.assertEquals import kotlin.test.assertNotNull import kotlin.test.assertNull

我正在尝试使用Klaxon库和kotlin解析包含枚举的json响应。下面是一个测试。如果我有一个可为空的枚举,我的解析就会失败。有没有办法做到这一点?这是克拉克森图书馆的问题吗

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

错误的来源是,将null转换为字符串。

我从github项目复制了EnumConverter并使其可为null,如果值为null,则将第23行更改为返回null,如下所示:

       val name = jv.inside as String? ?: return null
然后,我为字段创建了一个注释,并将转换器添加到解析器中。下面的EnumConverter()引用是我的副本,上面添加了Elvis运算符

...
@Target(AnnotationTarget.FIELD)
annotation class NullableEnum

class WithEnum (
    @NullableEnum
    var myVal: MyEnum? = null
)

class EnumTest {
    @Test
    fun `should deserialize null enum`() {
        val parsed = Klaxon()
            .fieldConverter(NullableEnum::class, EnumConverter())
            .parse<WithEnum>("{ \"myVal\":null}")
        assertNotNull(parsed)
        assertNull(parsed.myVal)
    }
...
。。。
@目标(AnnotationTarget.FIELD)
注释类NullableEnum
使用枚举初始化(
@NullableEnum
var myVal:MyEnum?=null
)
类枚举测试{
@试验
fun`应该反序列化空枚举'(){
val parsed=Klaxon()
.fieldConverter(NullableEnum::类,EnumConverter())
.parse(“{\“myVal\”:null}”)
assertNotNull(已解析)
assertNull(已解析的.myVal)
}
...
...
@Target(AnnotationTarget.FIELD)
annotation class NullableEnum

class WithEnum (
    @NullableEnum
    var myVal: MyEnum? = null
)

class EnumTest {
    @Test
    fun `should deserialize null enum`() {
        val parsed = Klaxon()
            .fieldConverter(NullableEnum::class, EnumConverter())
            .parse<WithEnum>("{ \"myVal\":null}")
        assertNotNull(parsed)
        assertNull(parsed.myVal)
    }
...