应用中字符串转JSON时出现IllegalStateException错误求助
排查Gson解析JSON时的IllegalStateException错误
我来帮你分析下这个问题哈!你遇到的java.lang.IllegalStateException: Not a JSON Object错误,看起来有点矛盾——毕竟你贴出来的JSON明明是个标准的对象格式对吧?咱们一步步来排查:
可能的错误原因
- 响应字符串存在多余字符:服务器返回的
response可能在JSON内容前后带有空白字符、换行符,甚至是UTF-8 BOM头(某些服务器返回会带这个),导致Gson解析时无法识别为标准JSON对象。 - 代码直接强转的风险:你当前的代码直接调用
getAsJsonObject(),如果解析后的JsonElement不是对象类型(比如实际是数组、字符串或者null),就会抛出这个异常——哪怕你看到的JSON是对象,实际返回的响应可能和你贴的不一样。 - 旧版Gson的兼容问题:如果你使用的是较老版本的Gson,
JsonParser的解析逻辑可能存在一些边界情况处理的问题。
对应的解决方法
1. 先检查原始响应内容
先把完整的response字符串打印出来(或者打日志),看看是不是真的和你贴的JSON一致,有没有多余的前缀/后缀。如果有空白字符,可以先做trim处理:
String cleanedResponse = response.trim(); JsonElement element = new JsonParser().parse(cleanedResponse);
如果是UTF-8 BOM头的问题,可以用这段代码去掉:
if (response.startsWith("\uFEFF")) { response = response.substring(1); }
2. 增加类型判断再强转
不要直接调用getAsJsonObject(),先判断解析后的元素类型,避免强转失败:
JsonParser parser = new JsonParser(); JsonElement element = parser.parse(response); if (element.isJsonObject()) { JsonObject toto = element.getAsJsonObject(); testhash = toto.get("access_token").getAsString(); } else { // 打印异常内容,方便排查 System.err.println("解析得到的不是JSON对象,实际内容:" + element); }
3. 使用更健壮的Gson解析方式
推荐用Gson.fromJson()方法来解析,它的容错性更强,甚至可以直接解析成实体类(更规范):
方式一:解析成JsonObject
Gson gson = new Gson(); JsonObject toto = gson.fromJson(response, JsonObject.class); testhash = toto.get("access_token").getAsString();
方式二:解析成实体类(更推荐)
先创建一个对应返回结构的实体类:
public class TokenResponse { private String access_token; private int expires_in; private String token_type; private String scope; private String refresh_token; private User user; // 内部类User public static class User { private int id; private String serverPath; private String username; private int defaultFolder; private String email; // 生成getter和setter方法 } // 生成getter和setter方法 }
然后直接解析:
Gson gson = new Gson(); TokenResponse tokenResponse = gson.fromJson(response, TokenResponse.class); testhash = tokenResponse.getAccess_token();
这种方式不仅更安全,后续获取其他字段也更方便。
4. 检查服务器返回的Content-Type
确认服务器返回的Content-Type是application/json,避免返回的内容夹杂了其他非JSON信息(比如HTML错误页)。
内容的提问来源于stack exchange,提问作者Asterakin
相关产品推荐
相关产品推荐

