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

Gson 序列化與反序列化完整指南:TypeToken、巢狀物件、陣列集合互轉

     編輯:Java 綜合教學

Gson 序列化與反序列化完整指南:TypeToken、巢狀物件、陣列集合互轉

系統整理 Gson 核心用法:基本物件轉換、JSON 陣列泛型捕獲、複雜巢狀結構解析、物件序列化為 JSON,含完整可執行測試代碼。

準備工作

  • 引入 gson-2.x.jar 並加入 Build Path
  • 定義 User 類:屬性 name/age、無參建構子、getter/setter、toString()

測試數據

String jsonObj   = "{\"name\":\"李四\",\"age\":30}";
String jsonArr   = "[{\"name\":\"李四\",\"age\":40},{\"name\":\"張三\",\"age\":20},{\"name\":\"王五\",\"age\":30}]";
String jsonNest  = "{\"status\":\"ok\",\"data\":[{\"name\":\"李四\",\"age\":30},{\"name\":\"張三\",\"age\":20},{\"name\":\"王五\",\"age\":30}]}";

1. 基本反序列化:JSON 物件 → Java 物件

private static void gsonTypeToken(String jsonArr) {
    Gson gson = new Gson();
    
    // TypeToken 匿名內部類捕獲泛型型別資訊(繞過類型擦除)
    TypeToken<List<User>> token = new TypeToken<List<User>>() {};
    List<User> users = gson.fromJson(jsonArr, token.getType());
    
    for (User u : users) System.out.println(u);
}

原理:TypeToken 是 protected 抽象類,建立匿名子類時,JVM 保留泛型型別資訊,getType() 返回實際的 ParameterizedType。

3. 巢狀結構解析:Wrapper 類映射

// 對應 jsonNest 的資料類
class A {
    private String status;
    private List<User> data;
    // getter/setter...
}

private static void gsonFinal(String jsonNest) {
    Gson gson = new Gson();
    A a = gson.fromJson(jsonNest, A.class);
    
    if ("ok".equals(a.getStatus())) {
        System.out.println(a.getStatus());
        for (User u : a.getData()) System.out.println(u);
    }
}

4. 序列化:Java 物件 → JSON


核心 API 總結

場景方法關鍵點
物件 → JSONgson.toJson(obj)支援任意物件、陣列、集合、Map
JSON → 物件gson.fromJson(json, Class<T>)目標類需有無參建構子
JSON 陣列 → List<T>gson.fromJson(json, TypeToken<List<T>>{}.getType())必須用 TypeToken 保留泛型
巢狀 JSON → 物件定義 Wrapper 類映射層級層級對應、集合屬性用 List<T>

常見坑點

  • 無參建構子缺失:拋出 JsonIOException: Unable to invoke no-args constructor
  • 泛型擦除:直接傳 List.class 只能得到 List<LinkedTreeMap>
  • 欄位名不匹配:預設按欄位名匹配,可用 @SerializedName("json_field") 映射
  • null 值預設不序列化:需 new GsonBuilder().serializeNulls().create() 開啟
  • 日期格式:預設 yyyy-MM-dd'T'HH:mm:ss,可 GsonBuilder().setDateFormat("yyyy-MM-dd").create()

Gson 設計哲學:約定優於配置。只要 POJO 結構與 JSON 結構對應,零配置自動完成雙向轉換。

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