在您的描述中,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规范。这是序列化框架的默认行为,而非类中显式定义的字段。