android - 处理 JSON 中的多种动态数据类型

标签 android json gson retrofit2

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

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

当用户凭据错误时

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

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

为了解决这个问题,我遵循了 this解决问题的示例。这确实解决了 OBJECT/ARRAY 问题。

我有 3 个型号 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 时,切换回 .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;

}

}

关于android - 处理 JSON 中的多种动态数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54574170/

相关文章:

javascript - json 合并、数组推送、排序和删除 double

java - JSON 对象 GSON 放入列表中

javascript - 安卓。 WebView 。如何使元素不可点击?

android - 在 Android 的 EditText 中屏蔽输入

android - 如何在脚本完成后自动退出 Qpython (android) 控制台?

java - 带有 JSON 列的 CSV

安卓 'leaking context' 错误

javascript - 我是否为这个天气应用程序正确设置了 API?

java - Json格式错误,已经获取数组时再请求数组

java - 使用 gson 解析来自 google 地点的数据