【问题标题】:How can i apply @JsonSerialize annotation to a lib class property?如何将 @JsonSerialize 注释应用于 lib 类属性?
【发布时间】:2021-10-05 11:02:17
【问题描述】:

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

【问题讨论】:

标签: java jackson json-serialization


【解决方案1】:

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

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

public class Model {

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

现在,您无法修改上述库类的源代码。 但相反,您可以编写一个类(我们称之为ModelMixin) 哪种镜像库类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 类中获取注释 并将它们应用于Model 类。 这是由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"} 

【讨论】:

    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2016-08-10
    • 2011-04-09
    • 2021-03-28
    • 2020-11-29
    相关资源
    最近更新 更多