首页 > 解决方案 > 当 GET 返回 null 而不是 List 时,KotlinxSerializer 出现 NullPointerException

问题描述

使用 Ktor 我正在获取这样的列表,在某些情况下返回 null。

override suspend fun getDevices(accessToken: String): List<Device>? {
    return client.get {
        url(path = "/devices")
        header("Authorization", "Bearer $accessToken")
    }
}

但是,当后端返回 null 时,我得到一个异常:

W/System.err: java.lang.NullPointerException
W/System.err:     at io.ktor.client.features.json.serializer.KotlinxSerializer.read(KotlinxSerializer.kt:37)

这里最好的方法是什么?我认为最简单的方法是将后端调整为返回 [] 而不是 null,但是可以在客户端解决吗?还是普遍认为后端应该返回 [] 而不是 null?

标签: androidkotlinktorkotlinx.serialization

解决方案


问题是由于方法签名JsonSerializer,Ktor 中的 any 只能将 JSON 文本反序列化为不可为空的对象:read

fun read(type: TypeInfo, body: Input): Any

NullPointerException抛出是因为在该方法结束时!! 运算符用于将值转换为非空类型。

作为一种解决方法,您可以捕获NullPointerException并返回null值。此行为将在 Ktor 2.0.0 中修复。


推荐阅读