代码之家  ›  专栏  ›  技术社区  ›  Skyyy

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

  •  2
  • Skyyy  · 技术社区  · 6 年前

    以下是成功验证用户身份时的示例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 解决问题的示例。它确实解决了对象/数组问题。

    我有3种模式 LoginResponse , 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格式的字符串。

    当我访问.addConverterFactory时,切换回.addConverterFactory的顺序有时会导致崩溃。 登录响应 模型

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jendorski Labs    6 年前

    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;
    
    }
    
    }