ResponseGetUserByUserId 物件經 new Gson().fromJson(json, Clazz.class) 反序列化後,int 全為 0,String 全為 null,但 jsonData 列印正確。
private 或有 @SerializedName)。@SerializedName("json_field_name") 或改為 public / package-private。user_name vs Java userName。@SerializedName("user_name") 或設定 GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)。static class 或移至頂層類別。String 欄位、JSON 陣列對應單一物件。TypeAdapter。LocalDateTime、Optional 支援不全。public class ResponseGetUserByUserId {
@SerializedName("user_name")
private String userName;
@SerializedName("phone_country_code")
private int phoneCountryCode;
// 必須提供無參建構子 (Gson 透過 UnsafeAllocator 實例化,但建議保留)
public ResponseGetUserByUserId() {}
// Getter/Setter 可選,但建議提供供業務邏輯使用
public String getUserName() { return userName; }
public int getPhoneCountryCode() { return phoneCountryCode; }
}
// 解析
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) // 全域下劃線轉駝峰
.create();
ResponseGetUserByUserId resp = gson.fromJson(jsonData, ResponseGetUserByUserId.class);
// 1. 先解析為 JsonObject 檢查結構
JsonObject obj = JsonParser.parseString(jsonData).getAsJsonObject();
System.out.println(obj); // 確認鍵名、巢狀結構
// 2. 開啟 Gson 詳細日誌 (需自行實現 TypeAdapterFactory 記錄)