【问题标题】:Gson: Expected a string but was BEGIN_OBJECTGson:需要一个字符串,但是是 BEGIN_OBJECT
【发布时间】:2017-01-14 11:58:31
【问题描述】:

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

我不明白我做错了什么。

【问题讨论】:

  • 强烈建议使用gson 库来处理类似的事情......删除大量样板代码并且不易出错。
  • JsonReader 在 gson 库中
  • github.com/google/gson .....尤其是将您的 Java POJO 映射到/从 json 映射,而不是使用自定义代码。

标签: java gson


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。我检查了邮递员的回复,我可以确认这是我最初在这里发布的回复。
  • @student Postman 和您的应用程序请求标头设置可能不同,因此服务器可以对您的应用程序和 Postman 做出不同的响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多