使用Moshi处理错误响应

时间:2020-06-25 18:41:17

标签: android json moshi custom-error-handling

在我的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属性,这对我来说很清楚,因为我的{中没有这样的字段{1}}数据类。

我需要更改什么以便可以处理任何我希望的错误情况?我知道,我可以对第二个数据类建模并使用字段AccountError来命名为response,但是我的密封类error_message仅接受一个类作为泛型类型。 / p>

那我该怎么办?

1 个答案:

答案 0 :(得分:1)

如果您没有为数据类中的字段初始化值,则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都创建相同的数据类。