这是用户身份验证成功时我的示例JSON
{
"status": "success",
"message": "",
"data": {
"_id": {
"$id": "..."
},
"email": "...",
"name": "...",
"mobile": "...",
"mobile_status": "...",
"email_status": "..."
}
}
当用户凭证错误时
{
"status": "error",
"message": {
"msg": [
"Login detail incorrect"
]
},
"data": ""
}
注意消息
数据类型的变化
为了解决这个问题,我按照此示例来解决问题。这确实解决了对象/数组问题。
我有3个模型< code >登录响应 、< code >消息响应 、< code >数据响应,这是我尝试访问< code >消息响应的方式
我不确定我是否能用2
Gson messageDeserializer = new GsonBuilder().setLenient().registerTypeAdapter(LoginResponse.class, new MessageDeserializer()).create();
Gson dataDeserializer = new GsonBuilder().setLenient().registerTypeAdapter(LoginResponse.class, new DataDeserializer()).create();
builder.addConverterFactory(GsonConverterFactory.create(messageDeserializer));
builder.addConverterFactory(GsonConverterFactory.create(dataDeserializer));
我不认为这些自定义的 JsonDeserializer
正在按照它应该的方式工作。我无法转换这些 Json解串器的返回响应。我只能将它们作为字符串访问的唯一方法,这甚至不是正确的 JSON 格式字符串。
此外,当我访问 LoginResponse
模型时,切换 .addConverterFactory 的回序有时会导致崩溃
您是否有权访问网络错误
例如
Gson switchToDeserialise(int errorCode){
///i assume 200 means correct response. And 404 means there's an errorCode
Gson deserializer = new GsonBuilder().create();
switch(errorCode){
case 200:
return new GsonBuilder().setLenient().registerTypeAdapter(LoginResponse.class, new DataDeserializer()).create();
case 404:
return new GsonBuilder().setLenient().registerTypeAdapter(LoginResponse.class, new MessageDeserializer()).create();
default:
return deserializer;}}
注意:上面的代码没有经过测试。
=================================== 有点崩溃编辑真的 =============================================================================
根据我们的谈话,以及我对成功的观察
//in the retrofit response callback, get the status via JSONObject
JSONObject status = new JSONObject(response.toString()); throws Exception
String statusString = status.optString("status");
//now take the result of the string to a switch statement
Gson switchToDeserialise(String statusString){
///from what you've shown in the success & failure responses, status is either success or error, so...
Gson deserializer = new GsonBuilder().create();
switch(statusString){
case "success":
return new GsonBuilder().setLenient().registerTypeAdapter(LoginResponse.class, new DataDeserializer()).create();
case "error":
return new GsonBuilder().setLenient().registerTypeAdapter(LoginResponse.class, new MessageDeserializer()).create();
default:
return deserializer;
}
}