当 GET returns null 而不是 List 时,KotlinxSerializer 出现 NullPointerException

NullPointerException at KotlinxSerializer when GET returns null instead of a List

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

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

然而,当后端 returns null 我得到一个异常:

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

最好的方法是什么?我认为最简单的方法是将后端调整为return []而不是null,但是可以在客户端解决吗?或者后端应该 return [] 而不是 null?

问题是 Ktor 中的任何 JsonSerializer 只能将 JSON 文本反序列化为不可为 null 的对象,因为 read 方法签名:

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

抛出 NullPointerException 是因为在该方法的末尾使用 !! 运算符将值转换为非空类型。

作为解决方法,您可以捕获 NullPointerException 和 return null 值。此行为将在 Ktor 2.0.0 中修复。