jackson - 使用 Jackson MixIn 添加属性?
问题描述
我知道我们可以使用 Jackson MixIn 来重命名属性或忽略属性(请参见此处的示例)。但是可以添加属性吗?
添加的属性可以是:
- 常量(例如版本号)
- 计算值(例如,如果源类具有 and 的属性
getWidth()
,getHeight()
但我们想忽略两者并导出 agetArea()
代替) - 来自嵌套成员的扁平化信息(例如,一个类有一个成员
Information
,而成员又有一个成员Description
,我们希望有一个新属性description
并跳过 的嵌套结构Information
)
解决方案
从文档:
“混合”注释是一种将注释与类关联的方法,无需修改(目标)类本身,最初旨在帮助支持用户无法修改源以添加注释的第 3 方数据类型。
使用 mix-ins,您可以:
1. 定义“混合类”(或接口)的注释
2. 将与“目标类”(或接口)一起使用,这样它出现
3. 好像“目标类”具有“混合”类具有的所有注释(用于配置序列化/反序列化)
要解决您的问题,您可以:
- 创建
POJO
具有所有必填字段的新项。 - 实现自定义序列化程序。
- 在序列化之前转换
POJO
为Map
和添加/删除节点。 - 用于
com.fasterxml.jackson.databind.ser.BeanSerializerModifier
扩展自定义序列化程序。请参阅:Jackson 自定义序列化和反序列化。
例如,要为每个对象添加一个常量版本,您可以将其包装在Verisoned
类中:
class Versioned {
private final String version;
@JsonUnwrapped
private final Object pojo;
public Versioned(String version, Object pojo) {
this.version = version;
this.pojo = pojo;
}
public String getVersion() {
return version;
}
public Object getPojo() {
return pojo;
}
}
现在,如果你包装一个Arae(width, height)
对象:
Area area = new Area(11, 12);
String json = mapper.writeValueAsString(new Versioned("1.1", area));
输出将是:
{
"version" : "1.1",
"width" : 11,
"height" : 12
}