返回

保持纯净,修复`Cannot deserialize instance of java.util.ArrayList`

后端

无法从 START_OBJECT 令牌中反序列化 java.util.ArrayList 实例

简介

在使用 JSON 解析器将 JSON 数据反序列化为 Java 对象时,可能会遇到一个恼人的错误:“Cannot deserialize instance of java.util.ArrayList out of START_OBJECT token”。让我们深入了解此错误及其解决方法。

错误原因

此错误表示您尝试将包含数组的 JSON 数据反序列化为 Java 数组(例如 java.util.ArrayList),但 JSON 数据格式不正确。JSON 数组应以方括号“[”和“]”表示,而对象则以大括号“{”和“}”表示。当解析器遇到一个对象令牌(START_OBJECT)而不是一个数组令牌(START_ARRAY)时,就会发生此错误。

代码示例

假设您有一个 JSON 字符串:“[1, 2, 3]”,您希望将其反序列化为一个整型数组。但是,您错误地将其反序列化为一个对象:

import com.google.gson.Gson;

public class Example {
    public static void main(String[] args) {
        String json = "[1, 2, 3]";
        Gson gson = new Gson();
        int[] numbers = gson.fromJson(json, int[].class); // 错误:尝试将其反序列化为一个对象
    }
}

这将抛出“Cannot deserialize instance of java.util.ArrayList out of START_OBJECT token”错误。

解决方法

解决此错误的秘诀是确保 JSON 数据与您尝试反序列化的对象类型匹配。在这种情况下,您需要将 JSON 字符串反序列化为一个数组而不是对象:

import com.google.gson.Gson;

public class Example {
    public static void main(String[] args) {
        String json = "[1, 2, 3]";
        Gson gson = new Gson();
        int[] numbers = gson.fromJson(json, int[].class); // 正确:将其反序列化为一个数组
    }
}

您还可以使用 isJsonArray() 方法检查 JSON 数据的类型:

import com.google.gson.Gson;
import com.google.gson.JsonElement;

public class Example {
    public static void main(String[] args) {
        String json = "[1, 2, 3]";
        Gson gson = new Gson();
        JsonElement jsonElement = gson.fromJson(json, JsonElement.class);
        if (jsonElement.isJsonArray()) {
            // 是一个数组
        } else {
            // 不是一个数组
        }
    }
}

避免错误的提示

  • 检查 JSON 数据并确保其格式正确。
  • 使用正确的解析器方法(例如 fromJson(String, Class))来反序列化数据。
  • 使用 isJsonArray() 方法检查 JSON 数据的类型。
  • 在某些情况下,可以将 GsonBuilder 配置为宽松解析,这可能有助于解析格式不严格的 JSON 数据。

常见问题解答

  • 问:我收到此错误,即使我的 JSON 数据格式正确。
    答:可能是其他问题导致了错误。请仔细检查您的代码并确保所有内容都正确。
  • 问:如何查看 JSON 数据的原始格式?
    答:您可以使用 JSON 查看器或调试器来查看 JSON 数据的原始格式。
  • 问:如果我的 JSON 数据包含嵌套对象和数组,该怎么办?
    答:JSON 解析器可以处理嵌套数据结构。使用 JsonElementgetAsJsonArray()/getAsJsonObject() 方法来访问嵌套数据。
  • 问:是否有其他方法可以解析 JSON 数据?
    答:除了 Gson,还有其他 JSON 解析器,例如 Jackson 和 FastJson。选择最适合您需求的解析器。
  • 问:如何处理有格式错误的 JSON 数据?
    答:如果可能,请尝试修复 JSON 数据。否则,您可以使用宽松解析器或编写自定义解析逻辑来处理有格式错误的数据。

结论

Cannot deserialize instance of java.util.ArrayList out of START_OBJECT token”错误是由 JSON 数据格式不正确引起的。通过确保 JSON 数据与您尝试反序列化的对象类型匹配,您可以轻松解决此错误。记住,仔细检查数据并使用正确的解析方法对于成功反序列化至关重要。