首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Klaxon解析null枚举

Klaxon解析null枚举
EN

Stack Overflow用户
提问于 2020-01-08 01:21:53
回答 1查看 304关注 0票数 0

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

代码语言:javascript
复制
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)
    }
}

上面的单元测试的响应是:

代码语言:javascript
复制
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,其中null被转换为字符串。

EN

回答 1

Stack Overflow用户

发布于 2020-01-08 02:42:47

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

代码语言:javascript
复制
       val name = jv.inside as String? ?: return null

然后,我为字段创建了一个注释,并将转换器添加到解析器中。下面的EnumConverter()引用是我添加了上面的Elvis运算符的副本。

代码语言:javascript
复制
...
@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)
    }
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59633202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档