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”,該方法會直接跳過它們。其他注意事項:
以上是如何修復在 Android 中使用 GSON 解析巢狀 JSON 時出現的「預期 BEGIN_OBJECT 但為 NAME」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!