首页  >  文章  >  Java  >  如何修复在 Android 中使用 GSON 解析嵌套 JSON 时出现的“预期 BEGIN_OBJECT 但为 NAME”错误?

如何修复在 Android 中使用 GSON 解析嵌套 JSON 时出现的“预期 BEGIN_OBJECT 但为 NAME”错误?

DDD
DDD原创
2024-10-28 10:18:02902浏览

How to Fix the

Android 中使用 GSON 进行 JSON 解析

如何在 Android 中使用 GSON 简化 JSON 解析?让我们探讨一下使用 GSON 时的常见问题,并深入研究分步解决方案。

问题陈述:

当使用 GSON 解析 JSON 字符串时,您可能会遇到“预期为 BEGIN_OBJECT 但为 NAME”错误。当您尝试解析嵌套在数组中的 JSON 对象时,通常会发生这种情况。

JSON 示例:

考虑以下 JSON 数据:

<code class="json">{
    "count": "12",
    "colbreak": 1,
    "name": "unary rels",
    "score": "9090",
    "Words": [
        {
            "count": 6,
            "word": "prp_għaċ-",
            "name": "prp_għaċ-",
            "score": 9.1,
            "Words": "kol",
            "seek": 2231297
        }
    ],
    "seek": 0
}</code>

代码:

使用 GSON 进行解析的代码:

<code class="java">public static <T> ArrayList<T> JsonParse(T t, String response) {
    // ...
    while (reader.hasNext()) {
        T cse = (T) gson.fromJson(reader, t.getClass());
        lcs.add(cse);
    }
    // ...
}</code>

错误:

运行此代码可能会导致如下错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NAME at line 1 column 73

解决方案:

要解决此错误,您需要修改读取 JSON 值的方式。您应该跳到要解析的特定对象,然后对其进行解码,而不是循环遍历整个 JSON 字符串。

修订方法:

这是更正后的版本JsonParse 方法的:

<code class="java">public static <T> ArrayList<T> JsonParse(T t, String response) {
    // ...
    while (reader.hasNext()) {
        String name = reader.nextName();
        if (name.equals("Words")) {
            reader.beginArray();
            while (reader.hasNext()) {
                T cse = (T) gson.fromJson(reader, t.getClass());
                lcs.add(cse);
            }
            reader.endArray();
        } else {
            reader.skipValue();
        }
    }
    // ...
}</code>

解释:

在此修改后的方法中,代码检查当前 JSON 名称是否为“Words”,如果是,则开始读取数组。然后它循环遍历数组中的每个对象,使用 GSON 解析它们并将它们添加到列表中。对于任何其他 JSON 名称,例如“count”或“score”,该方法会直接跳过它们。

其他注意事项:

  • 确保您的模型类(GsonParse 和 Words)具有所有 JSON 字段的 getter 和 setter。
  • 如果您从 asset 文件夹中的文件读取 JSON,请确保使用 InputStreamReader 而不是 JsonReader。
  • 要支持 UTF-8 字符,请在解析 JSON 字符串之前将其转换为 UTF-8。

以上是如何修复在 Android 中使用 GSON 解析嵌套 JSON 时出现的“预期 BEGIN_OBJECT 但为 NAME”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn