使用Jackson MixIn's添加属性?

时间:2019-10-31 11:45:50

标签: jackson mixins

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

添加的属性可以是:

  1. 常量(例如版本号)
  2. 计算值(例如,如果源类具有getWidth()getHeight()的属性,但我们想同时忽略两者,而导出getArea()
  3. 来自嵌套成员的平息信息(例如,一个类有一个成员Information,而该成员又有一个成员Description,而我们想为description提供一个新属性,并跳过嵌套Information的结构)

1 个答案:

答案 0 :(得分:1)

来自documentation

  

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

     

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

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

  • 创建包含所有必填字段的新df = spark.table('your_table') display(df)
  • 实施自定义序列化程序。
  • 在序列化之前,将POJO转换为POJO并添加/删除节点。
  • 使用Map扩展自定义序列化程序。参见:Jackson custom serialization and deserialization

例如,要向每个对象添加恒定版本,可以将其包装在com.fasterxml.jackson.databind.ser.BeanSerializerModifier类中:

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));