【问题标题】:GSON serialization issue in Java for BigDecimalJava 中用于 BigDecimal 的 GSON 序列化问题
【发布时间】:2021-06-21 11:45:53
【问题描述】:

需要将 JSON 字符串转换为 Java 对象。

{
  "amount":1.0000
}

我正在尝试使用 GSON.fromjson(response, Amount.class); 来隐藏字符串;

该值在对象中更改为 1.0。请帮助解决这个问题。

我也在 objectmapper 中尝试过同样的事情。它不工作

【问题讨论】:

  • 你的 Amount.java 类是什么样的?
  • 你是如何检查值的?

标签: java json gson objectmapper


【解决方案1】:

考虑到你的 Amount 类是这样的:

class Amount {
    private BigDecimal amount;

    public BigDecimal getAmount() {
        return amount;
    }
}

ObjectMapper 解析正确。

@Test
void amountPrecisionTest() throws IOException {
    Amount amount = new ObjectMapper().readValue("{\"amount\":1.0000}", Amount.class);

    assertEquals(BigDecimal.valueOf(1.0000).setScale(4), amount.getAmount());
}

【讨论】:

  • 我可以将数量作为对象而不是 bigdecimal。有什么办法基于字符串小数点,它不应该删除零
【解决方案2】:

您应该编写自定义序列化器,如下所示:

 public class SerializerBigDecimal extends JsonSerializer<BigDecimal> {
    @Override
    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if(Objects.isNull(value)) {
            gen.writeNull();
        } else {
                         // take the floor value
            gen.writeNumber(value.setScale(4, RoundingMode.FLOOR));
        }
    }
}

然后在您的 POJO 中将注释放在您的 "amount" 字段上:

@JsonSerialize(using = SerializerBigDecimal.class)
private BigDecimal amount;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多