【问题标题】:java.io.EOFException: End of input at line 1 column 1 path $ in Gson parserjava.io.EOFException:Gson 解析器中第 1 行第 1 列路径 $ 的输入结束
【发布时间】:2017-04-18 09:34:26
【问题描述】:

我正在使用 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);
        }

    }
}

更新我将body.toString() 分配给变量,不知何故它起作用了。

String response = body.string();

BaseApiDto errorDto = adapter.fromJson(response);

【问题讨论】:

  • 您的正文字符串表示为空。
  • 尝试将您的 JSON 更改为 {"message":"Email has already been taken"} 删除 [] 大括号,它们表示 JSON 中的数组。而且你的String message 不应该是一个字符串数组。
  • @TheLearner :不,我的情况需要数组列表。
  • @HuyTower 我敢打赌。我不知道body.string() 是如何工作的以及它来自哪里,但似乎body.string() 试图读取“剩余”流,因此我怀疑第二次调用可以进行后续读取。引入一个变量,将body.string()结果赋值给它,然后使用它两次,如果需要可以多次使用。
  • @HuyTower 为什么“不知何故”?根据定义,资源流是一次性的。 string() 通过readString() 工作,所以你不能读两遍。

标签: java android json gson


【解决方案1】:

它成功了,因为我没有给body.string() 打两次电话。

我将body.toString() 分配给变量,不知何故它起作用了。

String response = body.string();

BaseApiDto errorDto = adapter.fromJson(response);

【讨论】:

  • 是的,你必须调用它一次。即使你只是记录它。它不会工作
猜你喜欢
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多