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();

但我收到此错误:

java.lang.IllegalStateException:应为 STRING 但为 BEGIN_OBJECT

我不明白我做错了什么。

原文由 Student 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 672
2 个回答

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

原文由 Lyubomyr Shaydariv 发布,翻译遵循 CC BY-SA 3.0 许可协议

解决这个问题的想法类似于这个例子:你的 JSON 说 dCharg 是一个对象,而不是一个字符串:

“dCharg”:{“TEXT”:1000}

如果它应该是一个字符串,它应该是这样的:

“充电”:“1000”

也许你可以设计如下 {code:java}

公共类 BaseEmployee{/* 内容 */}

公共类 RegularEmployee 扩展了 BaseEmployee{/* 内容 */}

公共类承包商扩展 BaseEmployee{/* stuffs */} {code}

原文由 leonidaa 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题