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

Gson 反序列化錯誤:缺少無參建構子的解決方案

     編輯:Java 綜合教學

錯誤現象

使用 Gson 解析 JSON 字串時,拋出異常:

No-args constructor for class X does not exist. Register an InstanceCreator with Gson for this type to fix this problem.

根本原因

Gson 預設透過呼叫類別的無參建構子來實例化物件,再逐一設定欄位。若目標類別為非靜態內部類,編譯器會隱式新增一個持有外部類實例參考的建構子,導致類別缺少真正的無參建構子,Gson 便無法直接實例化。

解決方案

方法一:將內部類宣告為 static(推薦)

public class Outer {
    // 加上 static 關鍵字,移除對外部實例的隱性依賴
    public static class Inner {
        private String value;
        // 現在擁有隱式無參建構子,Gson 可正常運作
    }
}

方法二:註冊自定義 InstanceCreator

若無法修改類別(如第三方庫),可透過 GsonBuilder 註冊建立器:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(Inner.class, new InstanceCreator<Inner>() {
        @Override public Inner createInstance(Type type) {
            return new Outer().new Inner(); // 需外部實例
        }
    })
    .create();

方法三:使用 UnsafeAllocator(不建議常規使用)

Gson 內建 UnsafeAllocator 可繞過建構子直接分配記憶體,但依賴 sun.misc.Unsafe,屬非標準 API,跨 JDK 版本風險較高。

最佳實踐總結

  1. 優先將不需存取外部狀態的內部類標記為 static。
  2. 資料傳輸物件(DTO)應設計為頂層類或靜態內部類,並保留公共無參建構子。
  3. 若必須處理無無參建構子的類別,集中管理 InstanceCreator 註冊邏輯,避免分散在業務代碼中。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved