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



这是我在用户成功进行身份验证时的示例JSON

{
    "status": "success",
    "message": "",
    "data": {
        "_id": {
            "$id": "..."
        },
        "email": "...",
        "name": "...",
        "mobile": "...",
        "mobile_status": "...",
        "email_status": "..."
    }
}

当用户凭据错误时

{
    "status": "error",
    "message": {
        "msg": [
            "Login detail incorrect"
        ]
    },
    "data": ""
}

请注意 messagedata 数据类型的变化。使用改装配合,我收到了著名的错误Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

为了解决这个问题,我按照此示例来解决问题。这确实解决了对象/数组问题。

我有3个模型LoginResponseMessageResponseDataResponse这就是我尝试访问MessageResponseDataResponse的方式

不确定我是否可以使用 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 格式字符串。

此外,当我访问模型时,切换 .addConverterFactory 的回序有时会导致LoginResponse崩溃

您是否有权访问网络错误和响应代码?这样,您可以创建一个 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;
}
}

最新更新