首页 > 解决方案 > 使用 Jackson MixIn 添加属性?

问题描述

我知道我们可以使用 Jackson MixIn 来重命名属性或忽略属性(请参见此处的示例)。但是可以添加属性吗?

添加的属性可以是:

  1. 常量(例如版本号)
  2. 计算值(例如,如果源类具有 and 的属性getWidth()getHeight()但我们想忽略两者并导出 agetArea()代替)
  3. 来自嵌套成员的扁平化信息(例如,一个类有一个成员Information,而成员又有一个成员Description,我们希望有一个新属性description并跳过 的嵌套结构Information

标签: jacksonmixins

解决方案


文档

“混合”注释是一种将注释与类关联的方法,无需修改(目标)类本身,最初旨在帮助支持用户无法修改源以添加注释的第 3 方数据类型。

使用 mix-ins,您可以:
1. 定义“混合类”(或接口)的注释
2. 将与“目标类”(或接口)一起使用,这样它出现
3. 好像“目标类”具有“混合”类具有的所有注释(用于配置序列化/反序列化)

要解决您的问题,您可以:

  • 创建POJO具有所有必填字段的新项。
  • 实现自定义序列化程序。
  • 在序列化之前转换POJOMap和添加/删除节点。
  • 用于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
}

推荐阅读