Android 在JSON中处理多个动态数据类型
下面是用户成功进行身份验证时的JSON示例Android 在JSON中处理多个动态数据类型,android,json,gson,retrofit2,Android,Json,Gson,Retrofit2,下面是用户成功进行身份验证时的JSON示例 { "status": "success", "message": "", "data": { "_id": { "$id": "..." }, "email": "...", "name": "...", "mobile": "...", "mobile_status": "...", "em
{
"status": "success",
"message": "",
"data": {
"_id": {
"$id": "..."
},
"email": "...",
"name": "...",
"mobile": "...",
"mobile_status": "...",
"email_status": "..."
}
}
当用户凭据错误时
{
"status": "error",
"message": {
"msg": [
"Login detail incorrect"
]
},
"data": ""
}
注意消息
和数据
的数据类型的变化。使用改装配合,我收到了一个著名的错误预期的BEGIN\u数组,但在第1行第2列路径$
为了解决这个问题,我按照示例来解决这个问题。解决了对象/数组问题
我有三种型号LoginResponse
,MessageResponse
,DataResponse
,这就是我试图访问MessageResponse
和DataResponse
我不确定我是否能用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
并没有按照它应该的方式工作。我无法强制转换这些JsonDeserializer返回的响应。我只能以字符串的形式访问它们,这甚至不是一个正确的JSON格式的字符串
此外,当我访问
LoginResponse
model您是否有权访问网络错误和响应代码时,返回.addConverterFactory的顺序有时会导致崩溃?。这样,您可以创建一个switch语句,明确定义如何反序列化任何响应
比如说,
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;
}
}
响应代码始终为(登录成功/失败时)200。检测登录成功/失败的唯一方法是查看JSON中的成功。如果用户登录成功/失败,我可以使用
status
检测,但当用户登录失败时,我无法使用其modelOk访问失败消息,我理解。这里有一个想法:在收到响应后,使用JSONObject
库请求status
的结果,然后制定一个switch语句来定义反序列化。糟糕的是,我刚刚意识到,对于成功登录,我有不同的响应代码200;对于失败登录,我有不同的响应代码207。但是如何在onResponse
方法中传入定制的CoverterFactory,或者在此之前是否有方法检测响应代码?现在,基于状态success/error state,我正在使用new Gson().fromJson(data,DataResponse.class)手动反序列化响应
同样,当登录失败(POJO我在线生成)时,如果您使用的是,您可以从Response#code以及onResponse
和onError
方法中获取错误代码,因此您可以在两次回调中都使用switchToDeserialise
方法。对于从getMsg获取的NPE,IMO应该是String errorMessage=getMessage()。getMsg(0)
。