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

Android JSON 解析進階:從 JSONObject 到實體類的自動映射實戰(Gson/Fastjson 最佳實踐)

     編輯:Java 相關知識

前言

網絡請求返回的數據多為 JSON 格式。早期手動 optString/getInt 逐字段解析不僅繁瑣,還極易因字段變更導致崩潰。本文介紹如何利用成熟庫(Gson/Fastjson)實現 JSON 到 Java 實體類的自動雙向映射,大幅提升開發效率與穩定性。

JSON 基礎回顧

  • 兩大結構:對象 {"key": "value"}、數組 ["a", "b"]。
  • 值類型:字符串、數字、布爾、null、對象、數組。
  • Android 原生 org.json 包(JSONObject/JSONArray)僅適合極簡單場景。

實體類定義(POJO)

public class User {
    private String id;
    private String name;
    private String from;
    
    // Getter/Setter 省略(Lombok @Data 一鍵生成)
    
    @Override
    public String toString() {
        return "User[id=" + id + ", name=" + name + ", from=" + from + "]";
    }
}

方案一:Gson(Google 官方,最通用)

// 依賴:implementation 'com.google.code.gson:gson:2.10.1'

// JSON 字符串 → 實體對象
String json = "{\"id\":\"16\",\"name\":\"小李\",\"from\":\"河南\"}";
User user = new Gson().fromJson(json, User.class);

// 實體對象 → JSON 字符串
String jsonOut = new Gson().toJson(user);

優勢:標準兼容性佳、支持泛型 TypeToken、字段命名策略(@SerializedName)、自定義 TypeAdapter 處理複雜類型(日期、枚舉)。

方案二:Fastjson(阿里巴巴,國內極快)

// 依賴:implementation 'com.alibaba:fastjson:2.0.41'

User user = JSON.parseObject(json, User.class);
String jsonOut = JSON.toJSONString(user);

優勢:序列化/反序列化速度極快、功能豐富(@JSONField、過濾、循環引用處理)。注意:1.x 版本有歷史安全漏洞,務必升級 2.x。

進階:泛型集合解析

// JSON 數組 → List
String jsonArray = "[{\"id\":\"1\"},{\"id\":\"2\"}]";
Type listType = new TypeToken<List<User>>(){}.getType();  // Gson
List<User> users = new Gson().fromJson(jsonArray, listType);

// Fastjson
List<User> users2 = JSON.parseArray(jsonArray, User.class);

最佳實踐清單

  1. 統一異常處理:封裝 JsonUtil 捕獲 JsonSyntaxException/JSONException,返回 Optional<T> 或統一 Result 對象。
  2. 字段命名映射:後端下發 snake_case,前端實體 camelCase,配置 GsonBuilder.setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES) 或 @SerializedName。
  3. 日期統一:採用 ISO-8601 字符串 "2024-01-15T14:30:00Z",註冊統一 TypeAdapter<LocalDateTime>。
  4. ProGuard/R8 保護:實體類需 -keep class com.example.model.** { *; } 防止混淆導致字段丟失。
  5. 避免原生 JSONObject 手動解析:除非極簡單或動態 Schema 场景。

原生 JSONObject 轉實體(不推薦,僅作理解)

原文嘗試用反射 + Class.forName 實現通用解析,但缺乏類型轉換、異常處理、性能優化,屬於重造輪子且輪子不圓。生產環境請直接用 Gson/Fastjson/Jackson/Kotlinx.serialization。

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