3

假设我有下一个案例类:

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,所以当我评估asJsonfrom circe 时,我会得到科学计数法的结果:

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

为什么会发生这种情况?我认为原因是因为默认将字符串BigDecimal自动格式化为科学计数法。

我能做些什么来避免这种情况?可能正在创建另一种类型,它从BigDecimal?toString

4

1 回答 1

5

我假设您使用scala.math.BigDecimal,java.math.BigDecimal代码是相似的。改变对象序列化方式的方法是提供相应的隐式Encoder对象。不幸的是,两者JsonJsonNumber层次结构都是密封的,因此没有非常干净的解决方案,但您仍然可以使用JsonNumber.fromDecimalStringUnsafe该工具toString来返回您传入的任何字符串。所以您可以执行以下操作:

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

object Person {
  implicit final val bigDecimalAsPlainStringEncoder: Encoder[BigDecimal] = new Encoder[BigDecimal] {
    final def apply(value: BigDecimal): Json = Json.fromJsonNumber(JsonNumber.fromDecimalStringUnsafe(value.bigDecimal.toPlainString))
  }

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

}
于 2017-04-30T02:23:50.117 回答