“应为 BEGIN_OBJECT 但在第 1 行第 1 列为 STRING”

新手上路,请多包涵

我有这个方法:

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

我想解析一个 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 列为 STRING

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

阅读 726
2 个回答

即使没有看到您的 JSON 字符串,您也可以从错误消息中得知它不是解析为您的类实例的正确结构。

Gson 期望您的 JSON 字符串以对象左括号开头。例如

{

但是你传递给它的字符串以一个开引号开头

"

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

来自服务器的无效 JSON 应该始终是预期的用例。传输过程中可能会出现一百万件事。 Gson 有点棘手,因为它的错误输出会给你一个问题,你捕获的实际异常将是另一种类型。

考虑到所有这些,客户端的正确修复是

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

如果你想知道为什么你从服务器收到的 JSON 是错误的,你可以在异常处查看你的 catch 块。但即使这是您的问题,修复从互联网接收的 JSON 也不是客户的责任。

无论哪种方式,客户都有责任决定在收到错误的 JSON 时要做什么。两种可能性是拒绝 JSON 并且什么都不做,然后重试。

如果您要重试,我强烈建议在 try / catch 块内设置一个标志,然后在 try / catch 块外响应该标志。嵌套的 try / catch 很可能是 Gson 如何让我们陷入堆栈跟踪和异常不匹配的混乱局面。

换句话说,虽然我承认它看起来不太优雅,但我会推荐

boolean failed = false;

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

if (failed)
{
  //...

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

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