原始 JSON 字符串中 data 字段值被雙層轉義為字符串而非原生數組:
"data": "[ { \"rownum\":\"11\", ... } ]" // 錯誤:外層雙引號導致整個數組成字符串
直接 new JSONObject(str) 解析時,解析器在字符 42 處遇到未閉合的對象結構,拋出 JSONException: Unterminated object。
// ✅ 正確:data 為原生 JSONArray
{
"msg": 1,
"msgbox": "返回歌手分類!",
"data": [
{ "rownum": "11", "id": "1047", "userName": "敖日格勒", "picurl": "mobile1_1047_head.jpg" },
...
]
}
// ❌ 錯誤:data 為字符串
{
"msg": 1,
"msgbox": "返回歌手分類!",
"data": "[ { \"rownum\":\"11\", ... } ]"
}
toString() 或雙重序列化。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.cn 或 BeJSON,貼入原始字符串即可高亮錯誤位置、自動格式化、生成 Java 實體類。
fromJson(json, SingerList.class) 一鍵反序列化JSONException 上報日誌,包含原始報文前 500 字符「數組被雙引號包裹變字符串」是 Android JSON 解析最常見坑,修正數據源結構或雙層解析即可輕松破解。