Jackson反序列化时将父类变量纳入JSONObject是否无需自定义序列化器?
无需自定义Serializer的实现方案
当然可以不用写自定义序列化器,借助Jackson内置的注解就能实现需求,以下是两种直接可行的方案:
方案一:通过Getter方法包装父类字段
在ParentResponse里新增一个返回自身(父类实例)的Getter方法,给这个方法标记@JsonProperty("responseInfo"),同时把父类的status字段在子类里通过@JsonIgnore隐藏掉,避免平级输出:
public class DefaultResponse { private String status; // 标准的getter、setter方法 } public class ParentResponse extends DefaultResponse { @JsonIgnore @Override public String getStatus() { return super.getStatus(); } @JsonProperty("responseInfo") public DefaultResponse getResponseInfo() { return this; } }
序列化ParentResponse实例时,就会输出你要的{"responseInfo":{"status":"success"}}格式。
方案二:直接包装父类实例(适合无法覆盖Getter的场景)
如果不想覆盖父类的Getter方法,可以在ParentResponse里定义一个方法,手动组装出DefaultResponse实例并返回,同时给这个方法加@JsonProperty("responseInfo"),再把父类的status字段标记为@JsonIgnore:
public class ParentResponse extends DefaultResponse { // 如果能修改父类,直接给DefaultResponse的status字段加@JsonIgnore更省事 @JsonIgnore @Override public String getStatus() { return super.getStatus(); } @JsonProperty("responseInfo") public DefaultResponse getResponseInfo() { DefaultResponse wrapper = new DefaultResponse(); wrapper.setStatus(super.getStatus()); return wrapper; } }
这两种方法都完全依赖Jackson原生注解,不需要编写任何自定义序列化器,就能实现父类字段嵌套到指定键名下的效果。
内容的提问来源于stack exchange,提问作者Manivannan R
相关产品推荐
相关产品推荐

