【问题标题】:Serializing double to an int within POJO在 POJO 中将 double 序列化为 int
【发布时间】:2017-12-07 17:50:11
【问题描述】:

我无法弄清楚如何在 POJO 中将我的 double 序列化为 int。目前,我正在草率地在 setter 方法中进行转换。双精度值始终介于 0 和 1 之间。下面是我的 POJO 中的 getter 和 setter 方法:

@JsonProperty("costMargin")
public int getCostMargin() {
    return costMargin;
}

@JsonProperty("costMargin")
public void setCostMargin(double costMargin) {
        this.costMargin = (int)(Math.round(costMargin * 100));
}

谁能帮我弄清楚如何将这个 double 序列化为一个 int,而不在 setter 方法中进行转换?我正在尝试研究其他方法,例如创建一个序列化程序类,并在我的 Pojo 中包含一个注释。例如:@JsonSerialize(using = CustomDoubleSerializer.class)

【问题讨论】:

  • “将 double 序列化为 int”是什么意思?如果double 值对于int 来说太大会怎样?您需要澄清您要完成的工作。从代码看来,您希望将财务值存储为缩放整数(即美分),在这种情况下,只要您了解对浮点数进行四舍五入可能会产生意外结果,您就可以正常工作。您最好不要在代码中的任何位置对财务数据使用浮点数,但您可能没有该选项。
  • 很抱歉没有包含详细信息。双精度值始终介于 0 和 1 之间。除了设置和获取之外,我试图在我的 setter 或 getter 方法中不进行计算。

标签: java json serialization pojo


【解决方案1】:

答案是:你做不到。

您必须在某处通过截断或舍入将 double 转换为 int。

在您的代码中,您只是违反了 Java Bean 规范。 Getter 返回 int,但 Setter 有 double 作为参数。

如果是这样,您必须在 setter 中进行转换。否则,您必须在调用 setter 之前在调用者中执行此操作。

【讨论】:

  • 我正在尝试研究其他方法,例如创建一个序列化类,并在我的 Pojo 中包含一个注释:@JsonSerialize(using = CustomDoubleSerializer.class)
  • 为什么不呢?您仍然必须按照自己的规则将 double 转换为 int。 (即Math.round 你有)并且如果你有很多字段可以做到这一点 - 自定义序列化程序是有意义的。另外为了保持一致,为什么不使用超类 java.lang.Number 作为 getter/setter 而不是 int
【解决方案2】:

我最终使用了:

    @JsonSerialize(using = CustomDoubleSerializer.class)
    @JsonProperty("costMargin")
         public int getCostMargin() {
         return costMargin;
    }

打电话

public class CustomDoubleSerializer extends JsonSerializer<Double> {

@Override
public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers)
        throws IOException, JsonProcessingException {
    gen.writeObject((int)(Math.round(value * 100)));
}

}

公共类 CustomDoubleSerializer 扩展 JsonSerializer {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    相关资源
    最近更新 更多