2017-07-26 72 views
1

我用改裝來了解從API響應處理來自服務器的多個類型的反應,但我得到了不同類型從相同的API響應的,像這些如何通過改造

  1. 的JSONObject
  2. 字符串鍵入
  3. 布爾類型

基於這種情況,它給不同類型的來自同一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布爾字符串並執行相關操作。
但我得到這個例外同時處理對策:

響應:

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

任何人都可以建議我如何處理在改造單一類型的回調,這些反應?

如果我用一個字符串類型這樣的回調:

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 $ 

回答

0

服務器不能給你一個Boolean對象,並改造爲自動將字符串轉換爲JSONObject,因爲這是您告訴的類型

要停止該操作,只需請求一個字符串,並稍後解析它

new Callback<String>() 

或許

new Callback<JsonPrimitive>() 

您還可以得到response.raw屬性(這是在改造2.X)

+0

如果我將使用回調時,我想的JSONObject:它給人的follwing錯誤COM .google.gson.JsonSyntaxException:java.lang.IllegalStateException:期望一個字符串,但在BEGIN_OBJECT行1列2路徑$ ....如果我將使用回調當我想要「字符串」它會給--- --- com .google.gson.JsonSyntaxException:java.lang.IllegalStateException:期望一個字符串,但是BEGIN_OBJECT在第1行第2列路徑$ ---->我不知道如何處理布爾響應 – uma

+0

如果您總是*獲得JSON響應,您應該只使用Retrofit **與Gson轉換器** –

+0

相關:https: //stackoverflow.com/questions/32617770/how-to-get-response-as-string-using-retrofit-without-using-gson-or-any-other-lib –