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

stu*_*ent 14 java gson

我试图阅读一个简单的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();
Run Code Online (Sandbox Code Playgroud)

但是我收到了这个错误:

期望一个字符串,但是BEGIN_OBJECT

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

Lyu*_*riv 12

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

{ "response": "ok" }
Run Code Online (Sandbox Code Playgroud)

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

{ "response": {"status": "ok"} }
Run Code Online (Sandbox Code Playgroud)

这应该会失败

线程"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();
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

有:

JsonReader reader = new JsonReader(traceReader(new InputStreamReader(in, "UTF-8")))
Run Code Online (Sandbox Code Playgroud)

然后重新检查一下你是否真的得到了{ "response": "ok" }.

  • @student Postman 和您的应用程序请求标头设置可能不同,因此服务器可以对您的应用程序和 Postman 做出不同的响应。 (2认同)