2017-07-26 5 views
1

je retrofit pour obtenir une réponse de l'API, mais j'ai différents types de réponse de la même API, comme ceux-ciComment gérer plusieurs réponses de type à partir d'un serveur via mise à niveau

  1. JsonObject
  2. cordes tapez
  3. type booléen

sur la base de la situation, il donne différents types de réponses de la même API.
J'ai essayé d'utiliser ce code:

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

     } 
    }); 

Ici, je gardais ce type de retour comme « JSONObject » dans l'appel arrière et converti en une chaîne et vérifié si elle était un JsonObject ou booléen ou Chaîne et d'effectuer les actions liées à cela.
Mais je suis arrivé cette exception lors de la manipulation des réponses:

Réponse:

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

Quelqu'un peut-il me suggérer comment gérer ces réponses en un seul type de rappel en rénovation?

Si j'ai utilisé un type de chaîne comme un rappel comme celui-ci:

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

     } 
    }); 
} 

Je reçois cette erreur:

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

Répondre

0

Le serveur ne peut pas vous donner un objet booléen, et l'amélioration est convertir automatiquement une chaîne en JSONObject pour vous puisque c'est le type que vous lui avez dit

Pour arrêter cela, il suffit de demander une chaîne de caractères et de l'analyser plus tard

new Callback<String>() 

ou peut-être

new Callback<JsonPrimitive>() 

Vous pouvez également obtenir response.raw attribut (qui est dans 2.x Rénovation)

+0

si je vais utiliser Callback quand je veux JsonObject: il donne l'erreur follwing com .google.gson.JsonSyntaxException: java.lang.IllegalStateException: Attendu une chaîne mais était BEGIN_OBJECT à la ligne 1 colonne 2 chemin $ .... si je vais utiliser le rappel quand je veux "String" il donnera ---> com .google.gson.JsonSyntaxException: java.lang.IllegalStateException: attendait une chaîne mais était BEGIN_OBJECT à la ligne 1 colonne 2 chemin $ ----> je ne sais pas comment gérer la réponse booléenne – uma

+0

Vous devriez utiliser seulement Retrofit ** avec le convertisseur Gson ** si vous * toujours * obtenir une réponse JSON –

+0

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