2017-07-26 2 views
1

ich Retrofit eine Antwort von dem API erhalten verwendet, um mehr Typ-Reaktionen zu handhaben, aber ich habe verschiedene Arten von Antwort von dem gleichen API, wie dieserWie von einem Server durch Nachrüstung

  1. JsonObject
  2. String Typ
  3. Boolean Typ

Basierend auf der Situation, gibt es verschiedene Arten von Antworten aus der gleichen API.
Ich habe versucht, diesen Code zu verwenden:

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()); 

     } 
    }); 

Hier hielt ich den Rückgabetyp als „JSONObject“ in dem Aufruf zurück und umgewandelt in eine String und geprüft, ob es sich um eine JsonObject oder war boolean oder String und führen Sie die entsprechenden Aktionen aus.
Aber ich habe diese Ausnahme, während die Antworten der Handhabung:

Antwort:

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

Kann mir jemand empfehlen, wie diese Antworten in einzelnen Art von Rückruf bei Nachrüstungen behandeln?

Wenn ich einen String-Typ als Callback wie folgt verwendet:

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()); 

     } 
    }); 
} 

ich diese Störung erhalte:

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

Antwort

0

Der Server kann kein boolean Objekt geben, und Retrofit ist wird automatisch ein String in ein JSONObject umgewandelt, da dies der Typ ist, den Sie ihm gegeben haben

Um das zu stoppen, fordern Sie einfach einen String an und parsen Sie ihn später

new Callback<String>() 

oder vielleicht

new Callback<JsonPrimitive>() 

Sie auch response.raw Attribut erhalten können (die in Retrofit 2.x ist)

+0

wenn ich Rückruf verwenden, wenn ich JsonObject wollen: es gibt die follwing Fehler com .google.gson.JsonSyntaxException: java.lang.IllegalStateException: Erwartete eine Zeichenfolge, aber war BEGIN_OBJECT in Zeile 1 Spalte 2 Pfad $ .... Wenn ich Callback verwenden möchte, wenn ich "String" will gibt es ---> com .google.gson.JsonSyntaxException: java.lang.IllegalStateException: Erwartete eine Zeichenfolge, war aber BEGIN_OBJECT in Zeile 1 Spalte 2 Pfad $ ----> Ich weiß nicht, wie boolesche Antwort zu behandeln – uma

+0

Sie sollten nur Retrofit ** mit dem Gson-Konverter ** verwenden, wenn Sie * immer * erhalten eine JSON-Antwort –

+0

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

Verwandte Themen