自定义杰克逊BigDecimal 反序列化 - “覆盖行为”

问题描述

我正在使用 Jackson 反序列化 JSON。我们还使用 BigDecimal 类型将传入的 String 反序列化为,并且该值可以包含逗号,例如一万可以作为“10,000”提交。为了能够将此值反序列化为 BigDeciaml,我创建了一个简单的自定义类:

class BigDecimalCommaDeserializer : JsonDeserializer<BigDecimal>() {
    override fun deserialize(parser: JsonParser,context: DeserializationContext): BigDecimal? {
        return if (parser.text != null && parser.text.isNotEmpty())
            BigDecimal(parser.text.replace(",",""))
        else null
    }
}

并按如下方式接线:

    @JsonDeserialize(using = BigDecimalCommaDeserializer::class)
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    var unitCount: BigDecimal? = null,

我注意到,还有一个 com.fasterxml.jackson.databind.deser.std.BigDecimalDeserializer。这仍会被调用,还是我应该考虑从我的 BigDecimalCommaDeserializer 委托给它调用

解决方法

在这种情况下将使用自定义反序列化程序 BigDecimalCommaDeserializer。常见的 BigDecimalDeserializer 将在所有其他未指定自定义反序列化器的地方默认使用。