[英]Gson: Expected a string but was 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();
但我收到此错误:
java.lang.IllegalStateException:应为
STRING
,但为BEGIN_OBJECT
我不明白我做错了什么。
你的解析器很好。 如果您提供的代码片段确实属于您获得的异常堆栈跟踪,那么我相信您尝试解析的 JSON 的response
属性具有字符串以外的值。 例如,
{ "response": "ok" }
可以由您的解析器解析就好了。 但是,您可以使用解析器获得的最接近的异常消息是类似于以下的 JSON:
{ "response": {"status": "ok"} }
那应该会失败,例如
线程“main”java.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" }
。
只是在这里添加这个。 就我而言,我收到此错误是因为我试图将 JSON 对象直接解析为 ENUM。 GSON 期望直接使用字符串而不是 JSON 对象。
就我而言,我犯了一个错误建模响应。 我的错误是一个对象,我将它建模为一个字符串。 仔细查看我的 API 响应并建模修复它
解决此问题的想法类似于以下示例:您的 JSON 说 dCharg 是 object,而不是字符串:
"dCharg":{"TEXT":1000}
如果它应该是一个字符串,它会看起来像:
"dCharg":"1000"
也许你可以设计如下 {code:java}
公共 class BaseEmployee{/* 东西 */}
public class RegularEmployee 扩展 BaseEmployee{/* 东西 */}
公共 class 承包商扩展 BaseEmployee{/* 东西 */} {code}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.