2017-04-18 1 views
1

Je suis en train d'analyser une chaîne JSON en utilisant Gson et Retrofit. J'ai cette chaîne JSON:

{"message":["Email has already been taken"]} 

je reçois l'exception ci-dessous encore et ne savent pas pourquoi:

java.io.EOFException: End of input at line 1 column 1 path $ 
    at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1393) 
    at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:549) 
    at com.google.gson.stream.JsonReader.peek(JsonReader.java:425) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:205) 
    at com.google.gson.TypeAdapter.fromJson(TypeAdapter.java:260) 
    at com.google.gson.TypeAdapter.fromJson(TypeAdapter.java:273) 

Les gens qui savent comment obtenir la valeur du champ message s'il vous plaît me aider.

BaseApiDto.java

public class BaseApiDto { 

    @SerializedName("message") 
    public String[] message; 

    public String getError() { 
     return message[0]; 
    } 

} 

HandErrorUtils.java

public static void handleError(FragmentActivity activity, Throwable e) { 
    String msg = null; 
    if(e instanceof HttpException){ 
     // Error message in json 
     Gson gson = new Gson(); 
     TypeAdapter<BaseApiDto> adapter = gson.getAdapter(BaseApiDto.class); 
     ResponseBody body = ((HttpException) e).response().errorBody(); 

     // Status code 
     HttpException httpException = (HttpException) e; 
     int statusCode = httpException.code(); 

     if (statusCode == 500) { 
      showErrorDialog(activity, activity.getString(R.string.dialog_msg_error_401), true); 
     } else if (statusCode == 401) { 
      showErrorDialog(activity, activity.getString(R.string.dialog_msg_error_401), true); 
     } else { 
      try { 
       Timber.w("body.string() " + body.string()); 

       // TODO : EXCEPTION HAPPEN IN HERE 
       BaseApiDto errorDto = adapter.fromJson(body.string()); 

       msg = errorDto.getError(); 

       Timber.w("msg " + msg); 
      } catch (Exception ex) { 
       // TODO : EXCEPTION HAPPEN IN HERE 
       ex.printStackTrace(); 
      } 

      showErrorDialog(activity, msg, false); 
     } 

    } 
} 

MISE À JOUR J'assignez body.toString() à une variable, d'une certaine manière, il a travaillé.

String response = body.string(); 

BaseApiDto errorDto = adapter.fromJson(response); 
+1

La représentation de votre chaîne de caractères est vide. –

+0

Essayez de remplacer votre JSON par '{" message ":" Le message a déjà été envoyé "}' supprimez les [] 'accolades dans lesquelles ils indiquent un tableau dans JSON. Et votre 'String message' ne devrait pas être un tableau de chaînes. – TheLearner

+0

@TheLearner: Non, mon cas nécessite une liste de tableaux. –

Répondre

1

Cela a fonctionné parce que je n'ai pas appelé body.string() deux fois.

J'attribue body.toString() à variable, en quelque sorte cela a fonctionné.

String response = body.string(); 

BaseApiDto errorDto = adapter.fromJson(response); 
+1

Cela a fonctionné parce que vous ne l'avez pas appelé deux fois – EJP

+0

, vous devez l'appeler une fois, même si vous venez de l'enregistrer, ça ne marchera pas – fanjavaid