【问题标题】:Bigdecimal low value [duplicate]Bigdecimal 低值 [重复]
【发布时间】:2017-12-12 03:58:21
【问题描述】:

我在 mysql 数据库中存储的值非常低,类似于:

0.00000070
0.00000097

我正在使用 spring boot 将此值作为休息 api 提供,我的模型映射如下:

public class Account extends BaseEntity {   

    @Column(name = "VALUATION", precision = 15, scale = 8)
    @JsonView({ ViewsUtil.Ticker.class, ViewsUtil.Chart.class })
    @Setter @Getter
    private BigDecimal valuation;

    // others fields

在数据库中它被正确存储,就像我出现的那样,但是要显示,它就像这样显示:

{
   "valuation": 9.7e-7
}

有没有办法像存储一样显示?

谢谢

---- 编辑

把我的模型改成这个

    @Column(name = "VALUATION", precision = 15, scale = 8)
    @JsonView({ ViewsUtil.Ticker.class, ViewsUtil.Chart.class })
    @JsonDeserialize(using = LowValueDeserializer.class)
    @Setter @Getter
    private BigDecimal valuation;

我的自定义反序列化器是这样的:

@JsonComponent
public class LowValueDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
        System.out.println(parser.getDecimalValue());

        return parser.getDecimalValue().toPlainString();
    }
}

系统输出永远不会被调用,结果仍然相同。

【问题讨论】:

  • 见github.com/FasterXML/jackson-databind/wiki/…:寻找WRITE_BIGDECIMAL_AS_PLAIN
  • 您想格式化 BigDecimal 以进行显示。即使您想要的格式与重复帖子中使用的格式不同,这也是重复的。
  • @DwB 使用String.format() 和.toPlainString() 相比有什么优势吗?对于OP想要的应该更好
  • 阅读我的第一条评论,了解如何解决这个“问题”。关于您的最后一次编辑:您不会通过使用自定义 deserializer (应该转换JSON 值到 BigDecimal)。
  • @JBNizet 使用了您的建议,效果非常棒!谢谢

标签: java mysql spring spring-boot spring-data


【解决方案1】:

更新: 正如JB Nizet 在他的评论中所说,你必须使用:

WRITE_BIGDECIMAL_AS_PLAIN

从 Jackson 2.2 开始,WRITE_BIGDECIMAL_AS_PLAIN 在 Datatype-specific serialization 下可用,并且在 default 中设置为 false。

您可以使用ObjectMapper 中的enable() 方法将其设置为true,如下所示:

ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN); 

在将 BigDecimal 转换为 String 时,您必须使用 .toPlainString() 方法,如下所示:

String theWholeNumber = YourBigDecimalNumber.toPlainString();

我认为您的问题是,该值在您的 JSON-String 中以指数形式显示。我认为这不是问题,因为您在客户端和服务器端使用相同的模型(希望如此)。如果您想使用它,则无需更改格式。只是,如果你想显示它,你需要用.toPlainString()方法将它转换成String。

【讨论】:

  • 是的,我试过这个,使用@JsonDeserialize,但该方法从未被调用
  • 编辑了我的帖子并添加了我说的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多