如何通过改造处理来自服务器的多种类型响应

时间:2017-07-26 13:46:50

标签: android gson retrofit

我使用了改进来从API获得响应,但我从同一个API获得了不同类型的响应,比如这些

  1. 的JSONObject
  2. 字符串类型
  3. 布尔类型
  4. 根据具体情况,它提供了来自同一API的不同类型的响应 我试着使用这段代码:

       serverUtilities.getBaseClassService(getApplicationContext(), "").forgotPasswordSecurityAnswerCheck(in, new Callback<JsonObject>() {
            @Override
            public void success(JsonObject s, retrofit.client.Response response) {
                Log.d("forgot_password_respons", "--->" + "" + s.toString());
    
               /* to retrieve the string or integer values*/
    
                if (s.toString().equals("5")) {
                    utilities.ShowAlert("selected wrong question", "Forgot Password SecQues");
    
                }
                if (s.toString().equals("1")) {
                    // some alert here
    
                }
    
               /* to retrieve the boolean  values*/
    
                if (s.toString().equals("false")) {
                    utilities.ShowAlert(getResources().getString(R.string.otp_fail), "Forgot Password SecQues");
    
                }
    
                if (s.toString().equals("1")) {
                    utilities.ShowAlert("Email already registered", "Social Registration");
    
                }
           /*to retrieve the Json object*/
    
             else
                if (s.toString().charAt(0) == '{') {
                    Log.d("my_first_char", "" + s.toString().charAt(0));
    
                    try {
                        if (s.toString().contains("memberId")) {
                            String MemberId = s.get("memberId").getAsString();
                            String optId = s.get("otpId").getAsString();
                            Log.d("Forgot_pass_ques_act", "" + MemberId + "--->" + optId);
    
                            Singleton.setSuccessId(MemberId);
                            Singleton.setOptId(optId);
                            Intent intent = new Intent(ForgotPasswordQuestionActivity.this, PasswordActivity.class);
                            startActivity(intent);
                            Toast.makeText(ForgotPasswordQuestionActivity.this, "congrats!! second step Success ", Toast.LENGTH_SHORT).show();
    
                        } else if (s.toString().contains("mId")) {
    
                        }
                    } catch (Exception e) {
                        utilities.ShowAlert(e.getMessage(), "forgot passwordQues(catch)");
    
                        Log.d("forgot_password_error", "" + e.getMessage());
                    }
    
    
                    // Singleton.setSuccessId(s);
                }
            }
    
            @Override
            public void failure(RetrofitError error) {
                utilities.ShowAlert(error.getMessage(), "forgot passwordQues(server)");
    
                Log.d("forgot_passwo_secAnser", "--->" + error.getMessage());
    
            }
        });
    

    这里我在回调中将返回类型保留为“jsonObject”并转换为字符串并检查它是 JsonObject 还是 boolean < / strong>或字符串并执行与此相关的操作。
    但是在处理响应时我遇到了这个异常:

    响应:

         com.google.gson.JsonSyntaxException:Expected a com.google.gson.JsonObject but was com.google.gson.JsonPrimitive
    

    有人可以建议我如何在改装中使用单一类型的回调来处理这些响应吗?

    如果我使用String类型作为这样的回调:

    server_utilities.getBaseClassService(getApplicationContext(), "").forgotPasswordResponse(in, new Callback<String>() {
            @Override
            public void success(String s, retrofit.client.Response response) {
                Log.d("forgot password resp", "--->" + "" + s.toString());
    
            }
    
            @Override
            public void failure(RetrofitError error) {
    
    
                Log.d("forgot_password_error", "--->" + error.getMessage());
    
            }
        });
    }
    

    我收到此错误:

     com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $ 
    

2 个答案:

答案 0 :(得分:0)

服务器无法为您提供布尔对象,并且Retrofit会自动将String转换为JSONObject,因为它是您告诉它的类型

要停止它,只需请求一个字符串,稍后再解析

new Callback<String>() 

或者

new Callback<JsonPrimitive>() 

您还可以获得response.raw属性(在Retrofit 2.x中)

答案 1 :(得分:0)

将标签类型声明为 Object

@SerializedName("response") @Expose public Object response; 并在得到响应后检查类型并相应地转换为

if (response.body().response!=null &&  response.body().response instanceof Collection<?>) {
            //if you find response type is collection then convert to json then json to real collection object
            String responseStr = new Gson().toJson(data.diagnosis.provisionalDiagnosis);
            Type type=new TypeToken<List<Response>>(){}.getType();
            List<Response> responseList=new Gson().fromJson(responseStr,type);
            if(responseList.size() > 0){
                patientInfoBinding.phoneTv.setText(responseList.get(0).phnNo);
            }
        }else if (response.body() instanceof String){
            String res=response.body();
        }else {}

像上面一样,您可以检查 instanceof String/instanceof Boolean