我正在尝试阅读一个简单的JSON响应。
{"回复":"确定" }
这是我的代码:
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
String response = null;
boolean success = false;
reader.beginObject();
if (reader.hasNext())
{
String token = reader.nextName();
if (token.equals("response")) {
response = reader.nextString();
}
else {
reader.skipValue();
}
}
reader.endObject();
reader.close();
但是我收到了这个错误:
预期字符串但是BEGIN_OBJECT
我不明白我做错了什么。你能救我吗?
答案 0 :(得分:12)
您的解析器 很好。如果您提供的代码片段确实属于您正在获取的异常堆栈跟踪,那么我相信您尝试解析的JSON的response
属性具有除字符串之外的值。例如,
{ "response": "ok" }
可以很好地解析你的解析器。但是,您可以使用解析器获得的最接近的异常消息是类似于下面的JSON:
{ "response": {"status": "ok"} }
应该失败,如
线程“main”中的异常java.lang.IllegalStateException:期望一个字符串,但是第1行第16行的路径是$ BEGIN_OBJECT $ .response
另请注意,Gson至少在其最新版本中报告了有问题的位置(我使用Gson 2.5进行了测试)。只要确保你得到了预期的输入。如果您认为响应必须采用您提到的格式,那么只需尝试跟踪输入流并找出差异。在最简单但不是最有效的实现中跟踪输入流,你可以像这样有一个更高效的跟踪阅读器:
private static Reader traceReader(final Reader reader) {
return new Reader() {
@Override
public int read(final char[] buffer, final int offset, final int length)
throws IOException {
final int read = reader.read(buffer, offset, length);
if ( read != -1 ) {
// or any other appropriate tracing output here
out.print(new String(buffer, offset, read));
out.flush();
}
return read;
}
@Override
public void close()
throws IOException {
reader.close();
}
};
}
使用:
JsonReader reader = new JsonReader(traceReader(new InputStreamReader(in, "UTF-8")))
然后重新检查一下你是否真的得到{ "response": "ok" }
。