杰克逊::在序列化中为对象添加额外的字段

jde*_*lop 10 serialization json jackson

在序列化为JSON时,我需要向对象添加新属性.属性的值是在运行时计算的,并且在对象中不存在.同样的对象也可以用于创建具有不同set ot字段的不同JSON(具有子类的基类,但我不想仅为JSON生成创建一个).

这样做的最佳方法是什么,这不涉及创建自定义序列化程序类,它将负责整个对象字段的序列化?或者可能继承一些"基本"序列化器,只需将其输出并以某种方式添加新字段?

我了解了mixins,看起来可以重命名/隐藏一些字段,但似乎无法添加额外的字段.

Sta*_*Man 8

你能不能只在价值类中添加一个方法?请注意,它不必是公共的,也不必使用getter命名约定; 你可以这样做:

public class MyStuff {
   // ... the usual fields, getters and/or setters

   @JsonProperty("sum") // or whatever name you need in JSON
   private int calculateSumForJSON() {
        return 42; // calculate somehow
   }
}
Run Code Online (Sandbox Code Playgroud)

否则,您可以将POJO转换为JSON树值:

JsonNode tree = mapper.valueToTree(value);
Run Code Online (Sandbox Code Playgroud)

然后通过添加属性等来修改它.

  • 如果额外的字段不是被序列化的对象的职责的一部分,则此方法不起作用。例如。对象的 URL...知道它自己的地址不是对象的工作,而是更高层的工作。 (2认同)

dre*_*our 5

2021年呼唤...

我发现做到这一点的最简单方法是@JsonUnwrapped

public class Envelope<T> {
  @JsonUnwrapped // content's fields are promoted alongside the envelope's
  public T content;
  // Transmission specific fields
  public String url;
  public long timestamp;
}
Run Code Online (Sandbox Code Playgroud)

只要Envelope's字段名不与content. 还有一个很好的功能,即在序列化 JSON 的末尾保留传输属性。