Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在JSON中处理多个动态数据类型_Android_Json_Gson_Retrofit2 - Fatal编程技术网

Android 在JSON中处理多个动态数据类型

Android 在JSON中处理多个动态数据类型,android,json,gson,retrofit2,Android,Json,Gson,Retrofit2,下面是用户成功进行身份验证时的JSON示例 { "status": "success", "message": "", "data": { "_id": { "$id": "..." }, "email": "...", "name": "...", "mobile": "...", "mobile_status": "...", "em

下面是用户成功进行身份验证时的JSON示例

{
    "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)