【发布时间】:2021-10-05 11:02:17
【问题描述】:
我在我的项目中使用了一个外部库。其中一个模型具有 BigDecimal 属性,需要自定义精度。如果这个模型是我的,我会应用一个使用自定义序列化程序的 @JsonSerialize 注释。但我不能修改分机的来源。解放... 有没有办法以某种方式应用它?
【问题讨论】:
标签: java jackson json-serialization
我在我的项目中使用了一个外部库。其中一个模型具有 BigDecimal 属性,需要自定义精度。如果这个模型是我的,我会应用一个使用自定义序列化程序的 @JsonSerialize 注释。但我不能修改分机的来源。解放... 有没有办法以某种方式应用它?
【问题讨论】:
标签: java jackson json-serialization
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());
}
}
现在你需要告诉杰克逊的ObjectMapper
从ModelMixin 类中获取注释
并将它们应用于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"}
【讨论】: