首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Android JSON 解析完全指南:從入門到實戰最佳實踐

     編輯:Java 相關知識

前言

JSON (JavaScript Object Notation) 以其輕量級、易讀寫、易於機器解析生成的特性,成為移動端與服務端數據交換的事實標準。Android SDK 在 org.json 包中提供了原生解析 API,無需引入第三方庫即可完成基本任務。本文將系統講解 JSON 結構、核心類用法、實戰解析流程及進階技巧。

一、 JSON 數據結構速覽

  • JSONObject:無序鍵值對集合,格式 { "key": value, ... }。Key 必須為 String,Value 可為 String、Number、Boolean、JSONObject、JSONArray、null。
  • JSONArray:有序值序列,格式 [ value, value, ... ]。值類型同 JSONObject。

二、 Android 核心解析類 (org.json)

類核心方法說明
JSONObjectget(String key)獲取值,**Key 不存在拋 JSONException**
opt(String key) / optString(key, fallback)獲取值,**Key 不存在返回 null 或默認值,不拋異常,推薦使用**
getJSONArray(key) / getJSONObject(key)直接獲取嵌套數組/對象
put(key, value)構建/修改 JSON 對象
JSONArrayget(int index) / opt(int index)按索引獲取值,異常行為同 JSONObject
length()獲取數組長度
put(value)追加/修改元素

核心建議:盡量使用 optXXX 系列方法,配合默認值,避免因後端字段缺失導致 App 崩潰,增強魯棒性。

三、 實戰解析流程:從網絡請求到數據模型

以獲取聯繫人列表為例 (https://api.androidhive.info/contacts/):

1. 獲取 JSON 字符串 (需在子線程/協程中執行網絡請求)

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) 並處理超時、重試、緩存等

2. 解析 JSON 字符串

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);
    }
}

3. 數據模型類示例

class Contact {
    String id, name, email, phone, city;
    // Constructor, getters, toString...
}

四、 進階技巧與避坑指南

1. 處理數值類型的陷阱

JSON 無長整型區分,Java optLong 可能截斷超出 Integer.MAX_VALUE 的值。對於 ID 類長數字,**建議作為 String 傳輸並用 optString 解析**。

2. 日期時間處理

JSON 無日期類型,通常約定為 ISO 8601 字符串 ("2023-10-01T12:00:00Z") 或時間戳。解析後用 SimpleDateFormat 或 DateTimeFormatter 轉換。

3. 大數據流式解析 (低內存)

若 JSON 極大 (如幾十 MB),JSONObject 全量加載會 OOM。可用 JsonReader (Android 內置流式解析器) 或 Gson/Moshi 流式 API 逐 Token 解析。

4. 為何生產環境推薦 Gson / Moshi / Kotlinx Serialization?

  • 自動映射:POJO ↔ JSON 雙向自動轉換,消除樣板代碼。
  • 類型安全:編譯期檢查,避免運行時 Key 拼寫錯誤。
  • Null 安全/默認值:Kotlin 數據類 + @SerialName 完美配合。
  • 性能:Moshi/Kotlinx 基於流式解析,內存佔用低、速度快。
  • 擴展性:自定義 TypeAdapter 處理複雜類型 (如日期、枚舉、多態)。

原生 org.json 適合:輕量級、動態結構、無依賴項目、快速原型驗證。

五、 總結

掌握 Android 原生 JSON 解析是基礎功,核心在於:理解 JSONObject/JSONArray 結構、善用 opt 系列方法增強容錯、規範異常處理。隨著項目增長,引入成熟序列化庫 (Gson/Moshi/Kotlinx) 能大幅提升開發效率、代碼質量與運行性能。選擇合適的工具,讓數據解析不再是業務邏輯的絆腳石。

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