android - 使用 Moshi 处理错误响应

在我的 Android 应用程序中,在发送了一些注册凭据后,我从服务器获得了以下 JSON 输出:

{
"response":"successfully registered new user",
"email":"testing@gmail.com",
"username":"testing",
"id":9,
"token":"98d26160e624a0b762ccec0cb561df3aeb131ff5"
}

我使用具有以下数据类的 Moshi 库对其进行建模:

@JsonClass(generateAdapter = true)
data class Account (
    @Json(name = "id")
    val account_id : Long,
    @Json(name="email")
    val account_email: String,
    @Json(name="username")
    val account_username: String,
    @Json(name="token")
    val account_authtoken : String,
    @Json(name="response")
    val account_response : String
)

一切正常。现在我想处理错误情况。当我收到错误消息时(比方说,我要注册的电子邮件已经存在),我应该得到这样的 JSON 输出:

// what the app gets when there is some error with the credentials
// e.g. email exists, username exists etc.  
{ 
"error_message" : "The email already exists", 
"response": "Error"
}

执行请求的方法如下所示:

override suspend fun register(email: String, userName: String, password: String, passwordToConfirm: String): NetworkResult<Account> {
        // make the request
        val response = authApi.register(email, userName, password, passwordToConfirm)

        // check if response is successful
        return if(response.isSuccessful){
            try {
                // wrap the response into NetworkResult.Success
                // response.body() contains the Account information
                NetworkResult.Success(response.body()!!)
            }
            catch (e: Exception){
                NetworkResult.Error(IOException("Error occurred during registration!"))
            }
        } else {
            NetworkResult.Error(IOException("Error occurred during registration!"))
        }
    }

如果响应成功,则将 response.body() 包装到 NetworkResult.Success 数据类中。 我的 NetworkResult 类是一个密封类,有两个子数据类 SuccessError。 它看起来像这样:

// I get the idea for this from https://phauer.com/2019/sealed-classes-exceptions-kotlin/
sealed class NetworkResult<out R> {
    data class Success<out T>(val data: T) : NetworkResult<T>()
    data class Error(val exception: Exception) : NetworkResult<Nothing>() 
}

但这并没有处理我上面提到的错误的 JSON 输出。当应用程序收到错误 JSON 输出时,Moshi 提示 Account 数据类没有 error_message 属性,这对我来说很清楚,因为我我的 Account 数据类中没有这样的字段。

我需要更改什么才能处理我希望的任何错误情况?我知道,我可以为第二个数据类建模并使用字段 responseerror_message 将其称为 Error 但我的密封类 NetworkResult 只接受一个类作为通用类型。

那么,我能做什么呢?

最佳答案

如果您没有为数据类中的字段初始化值,Moshi 会将其视为必填字段。

@JsonClass(generateAdapter = true)
data class Account (
    @Json(name = "id")
    val account_id : Long = 0,
    @Json(name="email")
    val account_email: String = "",
    @Json(name="username")
    val account_username: String = "",
    @Json(name="token")
    val account_authtoken : String = "",
    @Json(name="response")
    val account_response : String = "",
    @Json(name="error_message")
    val error_message : String = ""
)

像这样,您可以为 Success 和 Error 创建相同的数据类。

https://stackoverflow.com/questions/62582227/

相关文章:

vue.js - 当对象没有(可识别的)变化时触发 Vue 监视

rust - 我如何使字符串比闭包体生命周期更长?

javascript - Angular ngrx : TypeError: Cannot free

html - 如何在选择下拉菜单上设置 Font Awesome 图标?

java - SonarQube Scanner - 插件下载之间的长时间停顿

r - 在 Windows 上安装 odbc R 包时出现问题

java - 将内部 HashMap 类型强制转换为 Map

ios - UIView 作为@EnvironmentObject 的订阅者

python - DBSCAN 聚类甚至无法处理 40k 数据,但可以使用 python 和 skl

javascript - 如何使用 React 在客户端裁剪图像而不丢失分辨率