有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将@JsonSerialize注释应用于lib类属性?

我正在项目中使用外部库。其中一个模型具有BigDecimal属性,需要自定义精度。如果这个模型是我的,我将应用使用自定义序列化程序的@JsonSerialize注释。但是我不能修改ext.lib的源代码。。。 有什么方法可以应用它吗


共 (1) 个答案

  1. # 1 楼答案

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

    假设您有一个库类(名为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类。 这是由^{} 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"}