首頁  >  文章  >  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