首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android JSON 解析報錯「Unterminated object」根因與修復實戰

     編輯:程式設計綜合問答

錯誤現場還原

原始 JSON 字符串中 data 字段值被雙層轉義為字符串而非原生數組:

"data": "[ { \"rownum\":\"11\", ... } ]"  // 錯誤:外層雙引號導致整個數組成字符串

直接 new JSONObject(str) 解析時,解析器在字符 42 處遇到未閉合的對象結構,拋出 JSONException: Unterminated object。

標準 JSON 結構對比

// ✅ 正確:data 為原生 JSONArray
{
  "msg": 1,
  "msgbox": "返回歌手分類!",
  "data": [
    { "rownum": "11", "id": "1047", "userName": "敖日格勒", "picurl": "mobile1_1047_head.jpg" },
    ...
  ]
}

// ❌ 錯誤:data 為字符串
{
  "msg": 1,
  "msgbox": "返回歌手分類!",
  "data": "[ { \"rownum\":\"11\", ... } ]"
}

修復方案

  1. 後端修正(推薦):確保序列化庫(Gson、Jackson、Fastjson)直接輸出對象圖,避免手動 toString() 或雙重序列化。
  2. 前端兼容處理:若無法改後端,需兩步解析:
    JSONObject root = new JSONObject(rawJson);
    String dataStr = root.getString("data");        // 先取出字符串
    JSONArray dataArr = new JSONArray(dataStr);     // 再解析為數組
    for (int i = 0; i < dataArr.length(); i++) {
        JSONObject singer = dataArr.getJSONObject(i);
        // 正常提取字段
    }
    

調試利器:在線 JSON 校驗

推薦 JSON.cn 或 BeJSON,貼入原始字符串即可高亮錯誤位置、自動格式化、生成 Java 實體類。

最佳實踐清單

  • ✅ 後端統一使用標準序列化庫,禁用手動拼接 JSON 字符串
  • ✅ 定義 Java Bean 對應 JSON 結構,配合 Gson fromJson(json, SingerList.class) 一鍵反序列化
  • ✅ 單元測試覆蓋正常/空數組/字段缺失/類型不匹配等邊界情況
  • ✅ 生產環境捕獲 JSONException 上報日誌,包含原始報文前 500 字符

「數組被雙引號包裹變字符串」是 Android JSON 解析最常見坑,修正數據源結構或雙層解析即可輕松破解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved