【发布时间】: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()工作,所以你不能读两遍。