“期望BEGIN_OBJECT,但在第1行第1列”

我有这个方法:

public static Object parseStringToObject(String json) { String Object = json; Gson gson = new Gson(); Object objects = gson.fromJson(object, Object.class); parseConfigFromObjectToString(object); return objects; } 

我想parsing一个JSON:

 public static void addObject(String IP, Object addObject) { try { String json = sendPostRequest("http://" + IP + ":3000/config/add_Object", ConfigJSONParser.parseConfigFromObjectToString(addObject)); addObject = ConfigJSONParser.parseStringToObject(json); } catch (Exception ex) { ex.printStackTrace(); } } 

但是我收到一条错误消息:

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期的BEGIN_OBJECT,但是在第1行第1列

即使没有看到你的JSONstring,你可以从错误消息中知道,它不是正确的结构被parsing到你的类的一个实例。

Gson期待你的JSONstring以对象大括号开头。 例如

 { 

但是你传递给它的string以一个开引号开头

 " 

无效的JSON从服务器应始终是一个预期的用例。 在传输过程中有一百万件事情可能出错。 Gson是有点棘手,因为它的错误输出会给你一个问题,你捕获的实际exception将是一个不同的types。

考虑到这一切,客户端的适当修复是

 try { gson.fromJSON(ad, Ad.class); //... } catch (IllegalStateException | JsonSyntaxException exception) { //... 

如果你想知道为什么你从服务器收到的JSON是错误的,你可以看看你的catch块的例外。 但即使这是您的问题,修正它从互联网上收到的JSON不是客户的责任。

无论哪种方式,客户有责任决定如何处理JSON。 两种可能性是拒绝JSON,什么都不做,然后再试。

如果您要再试一次,我强烈build议在try / catch块内设置一个标志,然后在try / catch块之外响应该标志。 嵌套的try / catch可能是Gson如何让我们陷入这个混乱的堆栈跟踪和exception不匹配。

换句话说,即使我承认它看起来不太优雅,我会推荐

 boolean failed = false; try { gson.fromJSON(ad, Ad.class); //... } catch (IllegalStateException | JsonSyntaxException exception) { failed = true; //... } if (failed) { //... 

也许你的JSON Object是正确的,但你收到的响应不是你的有效数据。就像当你连接无效的WiFi ,你可能会收到一个奇怪的响应< html>.....< /html> GSON不能parsing。

你可能需要做一些try..catch..这个奇怪的反应,以避免崩溃。