如何避免circe JSON序列化中的科学记数法

时间:2017-04-28 19:13:33

标签: json scala bigdecimal circe

假设我有下一个案例类:

case class Person(id: String, money: BigDecimal)

object Person {
  implicit val encoder: Encoder[Person] = Encoder.forProduct2("ID", "Money")(u =>
    (u.id, u.money))

我想将Person类的实例序列化为JSON,所以当我从circe评估asJson时,我得到科学记数法的结果:

{
    "ID" : "123",
    "VALOR_SAP" : 2.7E+7
}

为什么会这样?我认为原因是因为BigDecimal字符串的默认值会自动格式化为科学记数法。

我该怎么做才能避免这种情况?可能会创建另一种类型,该类型从BigDecimal延伸并覆盖toString

1 个答案:

答案 0 :(得分:3)

我假设您使用scala.math.BigDecimal,因为java.math.BigDecimal代码类似。更改对象序列化方式的方法是提供相应的隐式Encoder对象。遗憾的是,JsonJsonNumber层次结构都是密封的,因此没有非常简洁的解决方案,但您仍然可以使用实现JsonNumber.fromDecimalStringUnsafe的{​​{1}}来返回您传入的任何字符串。所以你可以这样做:

toString