JSON (JavaScript Object Notation) 以其輕量級、易讀寫、易於機器解析生成的特性,成為移動端與服務端數據交換的事實標準。Android SDK 在 org.json 包中提供了原生解析 API,無需引入第三方庫即可完成基本任務。本文將系統講解 JSON 結構、核心類用法、實戰解析流程及進階技巧。
{ "key": value, ... }。Key 必須為 String,Value 可為 String、Number、Boolean、JSONObject、JSONArray、null。[ value, value, ... ]。值類型同 JSONObject。org.json)| 類 | 核心方法 | 說明 |
|---|---|---|
| JSONObject | get(String key) | 獲取值,**Key 不存在拋 JSONException** |
opt(String key) / optString(key, fallback) | 獲取值,**Key 不存在返回 null 或默認值,不拋異常,推薦使用** | |
getJSONArray(key) / getJSONObject(key) | 直接獲取嵌套數組/對象 | |
put(key, value) | 構建/修改 JSON 對象 | |
| JSONArray | get(int index) / opt(int index) | 按索引獲取值,異常行為同 JSONObject |
length() | 獲取數組長度 | |
put(value) | 追加/修改元素 |
核心建議:盡量使用 optXXX 系列方法,配合默認值,避免因後端字段缺失導致 App 崩潰,增強魯棒性。
以獲取聯繫人列表為例 (https://api.androidhive.info/contacts/):
private String fetchJsonFromNetwork() throws IOException {
String url = "https://api.androidhive.info/contacts/";
OkHttpClient client = new OkHttpClient(); // 推薦使用 OkHttp
Request request = new Request.Builder().url(url).build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
return response.body().string();
}
}
// 注意:生產環境請使用成熟網絡庫 (OkHttp/Retrofit) 並處理超時、重試、緩存等
void parseContacts(String json) {
try {
// 根對象
JSONObject root = new JSONObject(json);
// 獲取 contacts 數組
JSONArray contactsArray = root.optJSONArray("contacts");
if (contactsArray == null) return;
// 遍歷數組
for (int i = 0; i < contactsArray.length(); i++) {
JSONObject contact = contactsArray.optJSONObject(i);
if (contact == null) continue;
// 安全提取字段 (使用 opt 系列 + 默認值)
String id = contact.optString("id", "");
String name = contact.optString("name", "未知");
String email = contact.optString("email", "");
String phone = contact.optString("phone", "");
// 處理嵌套對象 (如 address)
JSONObject addressObj = contact.optJSONObject("address");
String city = addressObj != null ? addressObj.optString("city", "") : "";
// 構建數據模型對象
Contact contactModel = new Contact(id, name, email, phone, city);
// 加入列表、更新 UI 等...
Log.d("JSON_PARSE", "Parsed: " + contactModel);
}
} catch (JSONException e) {
Log.e("JSON_PARSE", "解析失敗", e);
}
}
class Contact {
String id, name, email, phone, city;
// Constructor, getters, toString...
}
JSON 無長整型區分,Java optLong 可能截斷超出 Integer.MAX_VALUE 的值。對於 ID 類長數字,**建議作為 String 傳輸並用 optString 解析**。
JSON 無日期類型,通常約定為 ISO 8601 字符串 ("2023-10-01T12:00:00Z") 或時間戳。解析後用 SimpleDateFormat 或 DateTimeFormatter 轉換。
若 JSON 極大 (如幾十 MB),JSONObject 全量加載會 OOM。可用 JsonReader (Android 內置流式解析器) 或 Gson/Moshi 流式 API 逐 Token 解析。
原生 org.json 適合:輕量級、動態結構、無依賴項目、快速原型驗證。
掌握 Android 原生 JSON 解析是基礎功,核心在於:理解 JSONObject/JSONArray 結構、善用 opt 系列方法增強容錯、規範異常處理。隨著項目增長,引入成熟序列化庫 (Gson/Moshi/Kotlinx) 能大幅提升開發效率、代碼質量與運行性能。選擇合適的工具,讓數據解析不再是業務邏輯的絆腳石。