gpt4 book ai didi

java - Gson:需要一个字符串但是是 BEGIN_OBJECT

转载 作者:搜寻专家 更新时间:2023-10-30 19:44:03 25 4
gpt4 key购买 nike

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

我不明白我做错了什么。

最佳答案

您的解析器没问题。如果您提供的代码片段确实属于您获得的异常堆栈跟踪,那么我相信您尝试解析的 JSON 的 response 属性具有字符串以外的值。例如,

{ "response": "ok" }

可以被你的解析器很好地解析。但是,您可以通过解析器获得的最接近的异常消息是类似于下面的 JSON:

{ "response": {"status": "ok"} }

应该会失败并出现类似的东西

Exception in thread "main" java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 16 path $.response

另请注意,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"}

关于java - Gson:需要一个字符串但是是 BEGIN_OBJECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41649731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com