在您的描述中,BankInfoVO子類返回的JSON中出現了"success": true字段,但類本身沒有定義這個字段。這通常是由以下原因之一造成的:
原因分析及解決方案
序列化框架的Getter自動推導
Java序列化框架(如Jackson/Gson)會將符合JavaBean規范的方法自動推導為JSON字段
父類BaseModal中的isSuccess()方法滿足條件:
public boolean isSuccess() { return error_no == 0; // 自動推導為JSON的"success"字段
? 結論: isSuccess()被框架解析為success字段(自動去掉is前綴并首字母小寫)
繼承機制的影響
由于BankInfoVO繼承自BaseModal,父類的isSuccess()方法被子類繼承
序列化子類時,父類的Getter方法依然會被處理
框架配置行為(常見場景)
Jackson默認配置SerializationFeature.FAIL_ON_EMPTY_BEANS為false時允許空對象
關鍵注解可能被使用:
@JsonProperty("success") // 強制指定JSON字段名public boolean isSuccess() { ... }
調試排查步驟
檢查類定義:確保沒有success字段或無關的Getter
查看序列化配置:檢查ObjectMapper是否啟用額外特性
使用調試斷點:在isSuccess()方法打斷點,觀察調用棧
示例代碼還原現象
// 父類
class BaseModal {
private int error_no;
public int getError_no() { return error_no; }// 此方法會導致JSON生成"success"字段
public boolean isSuccess() {return error_no == 0; // 核心邏輯
}
// 子類
class BankInfoVO extends BaseModal {
private String bankName;
// 無success字段!
// 序列化結果
BankInfoVO vo = new BankInfoVO();
vo.setError_no(0);
new ObjectMapper().writeValueAsString(vo);
// 輸出: {“error_no”:0, “success”:true, …}
如何避免字段暴露?
若需隱藏success字段,可通過以下方式:
@JsonIgnore // Jackson注解忽略此方法
public boolean isSuccess() { … }
// 或使用混合注解
@JsonIgnoreProperties({“success”}) // 類級別忽略
class BankInfoVO extends BaseModal { … }
關鍵點總結:JSON中的success字段是由isSuccess()方法在序列化過程中被自動推導生成的,符合JavaBean規范。這是序列化框架的默認行為,而非類中顯式定義的字段。