我如何将 @JsonSerialize 注释应用于库 class 属性?

How can i apply @JsonSerialize annotation to a lib class property?

我在项目中使用外部库。其中一个模型有一个 BigDecimal 属性,需要自定义精度。如果这个模型是我的,我会应用一个使用自定义序列化器的@JsonSerialize 注释。但我不能修改分机的来源。自由... 有没有办法以某种方式应用它?

Jackson 正是为这个用例提供了所谓的 mixins。 为了说明如何使用它,让我们来看一个例子:

假设您有一个库 class(名为 Model)包含 类型为 BigDecimal 的 属性。`

public class Model {

    private BigDecimal number;
    
    public BigDecimal getNumber() {
        return number;
    }
    
    public void setNumber(BigDecimal number) {
        this.number = number;
    }
}

现在,您无法修改上述库的源代码class。 但是,您可以写一个 class(我们称它为 ModelMixin) 哪种镜像库 class Model 和 把任何杰克逊注释放在那里。 特别是你可以指定你自己的序列化器 BigDecimal number 属性.

public abstract class ModelMixin {

    @JsonSerialize(using = MyBigDecimalSerializer.class)
    private BigDecimal number;
}

序列化程序可能简单也可能复杂 正如你所需要的。这是一个简单的 选择将 BigDecimal 写成 JSON 字符串。

public class MyBigDecimalSerializer extends JsonSerializer<BigDecimal> {

    @Override
    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeString(value.toString());
    }
}

现在你需要告诉杰克逊 ObjectMapperModelMixin class 中获取注释 并将它们应用于 Model class。 这是由 addMixIn(Class,Class) method.

完成的
ObjectMapper objectMapper = new ObjectMapper()
    .addMixIn(Model.class, ModelMixin.class);
    
Model model = new Model();
model.setNumber(BigDecimal.valueOf(123.456));
    
objectMapper.writeValue(System.out, model);

这将写入以下 JSON 输出:

{"number":"123.456"}