java.io.EOFException:在第1行的输入结束1列路径$在Gson解析器中

问题描述:

我正在使用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:不,我的情况需要数组列表。 –

它工作,因为我没有拨打body.string()两次。

我将body.toString()分配给变量,它以某种方式工作。

String response = body.string(); 

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

它的工作原理是因为你没有两次调用它。 – EJP

+0

是,你只需要调用一次,即使你只是记录它,它也不起作用 – fanjavaid