Аннотация Джексона для преобразования значения BigDecimal и установки масштаба в 2 - PullRequest
1 голос
/ 30 мая 2019

У меня есть POJO, например, где у меня есть поле BigDecimal:

public class Foo implements Serializable {

   private BigDecimal amount;
}

Я хочу иметь значение BigDecimal с точностью до 2. Существует ли какая-либо аннотация, с помощью которой я могу напрямую изменить ее значение на уровне самого поля? Я также не могу изменить его тип.

Хотя это можно сделать с помощью getter и ObjectMapper в приложении.

1 Ответ

1 голос
/ 31 мая 2019

Если вы хотите установить масштаб, вам нужно позаботиться о округлении. У вас есть несколько вариантов, например ROUND_HALF_EVEN , и вам нужно решить, какой режим округления использовать.

Для перехвата десериализации BigDecimal вы можете написать собственный десериализатор. Ниже приведен пример того, как это сделать, мы можем расширить его по умолчанию и установить масштаб после десериализации:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.deser.std.NumberDeserializers;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();

        Foo person = mapper.readValue(jsonFile, Foo.class);
        System.out.println(person);
    }
}

class BigDecimal2JsonDeserializer extends NumberDeserializers.BigDecimalDeserializer {

    @Override
    public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        BigDecimal value = super.deserialize(p, ctxt);

        // set scale
        value = value.setScale(2, BigDecimal.ROUND_HALF_EVEN);

        return value;
    }
}

class Foo {

    @JsonDeserialize(using = BigDecimal2JsonDeserializer.class)
    private BigDecimal amount;

    public BigDecimal getAmount() {
        return amount;
    }

    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

    @Override
    public String toString() {
        return "Foo{" +
                "amount=" + amount +
                '}';
    }
}

Для ниже JSON полезная нагрузка:

{
  "amount": 16.127
}

над отпечатками приложений:

Foo{amount=16.13}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...