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

2022-09-01 17:46:13

我正在尝试读取一个简单的 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: expected but wasSTRINGBEGIN_OBJECT

我不明白我做错了什么。


答案 1

你的解析器很好。如果您提供的代码片段确实属于您正在获取的异常堆栈跟踪,那么我相信您尝试解析的 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" }


答案 2

只需在此处添加此内容。在我的情况下,我得到了这个错误,因为我试图将JSON对象直接解析为ENUM。GSON 期望直接使用字符串而不是 JSON 对象。


推荐