Gson:期待一个字符串,但是BEGIN_OBJECT

我试图阅读一个简单的JSON响应。

{“response”:“ok”}

这是我的代码:

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

我不明白我做错了什么。 你能帮助我吗?

你的解析器很好。 如果您提供的代码片段确实属于您正在获取的exception堆栈跟踪,那么我相信您尝试解析的JSON的response属性具有除字符串之外的值。 例如,

 { "response": "ok" } 

可以解析你的解析器就好了。 但是,您可以使用解析器获得的最接近的exception消息是类似于下面的JSON:

 { "response": {"status": "ok"} } 

应该失败的东西,如

线程“main”中的exceptionjava.lang.IllegalStateException:期望一个字符串,但在第1行第16列路径为$。response的BEGIN_OBJECT

另请注意,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" }