在我的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
类是具有两个子数据类Success
和Error
的密封类。
看起来像这样:
// 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}}数据类。
我需要更改什么以便可以处理任何我希望的错误情况?我知道,我可以对第二个数据类建模并使用字段Account
和Error
来命名为response
,但是我的密封类error_message
仅接受一个类作为泛型类型。 / p>
那我该怎么办?
答案 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都创建相同的数据类。