使用 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 便無法直接實例化。
public class Outer {
// 加上 static 關鍵字,移除對外部實例的隱性依賴
public static class Inner {
private String value;
// 現在擁有隱式無參建構子,Gson 可正常運作
}
}
若無法修改類別(如第三方庫),可透過 GsonBuilder 註冊建立器:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Inner.class, new InstanceCreator<Inner>() {
@Override public Inner createInstance(Type type) {
return new Outer().new Inner(); // 需外部實例
}
})
.create();
Gson 內建 UnsafeAllocator 可繞過建構子直接分配記憶體,但依賴 sun.misc.Unsafe,屬非標準 API,跨 JDK 版本風險較高。
static。InstanceCreator 註冊邏輯,避免分散在業務代碼中。