2017-04-18 108 views
1

我正在使用Gson和Retrofit解析JSON字符串。我有這樣的JSON字符串:

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

我得到下面的異常仍然不知道爲什麼:

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) 

的人誰知道如何得到message字段的值,請幫助我。

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

    } 
} 

UPDATE我給你body.toString()變量,不知何故它的工作。

String response = body.string(); 

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

您的身體字符串表示形式爲空。 –

+0

嘗試將您的JSON轉換爲'{「message」:「電子郵件已被採用」}'刪除它們表示JSON數組的'[]'括號。而你的'String message'不應該是一個字符串數組。 – TheLearner

+0

@TheLearner:不,我的情況需要數組列表。 –

回答

1

它工作,因爲我沒有撥打body.string()兩次。

我將body.toString()分配給變量,它以某種方式工作。

String response = body.string(); 

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

它的工作原理是因爲你沒有兩次調用它。 – EJP

+0

是,你只需要調用一次,即使你只是記錄它,它也不起作用 – fanjavaid

相關問題