如何避免circe JSON序列化中的科学符号

如何避免circe JSON序列化中的科学符号,json,scala,bigdecimal,circe,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"

假设我有下一个案例课:

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
扩展而来的类型,并重写
到字符串

我假设您使用
scala.math.BigDecimal
,对于
java.math.BigDecimal
代码类似。更改对象序列化方式的方法是提供相应的隐式
Encoder
对象。不幸的是,
Json
JsonNumber
层次结构都是密封的,因此没有非常干净的解决方案,但您仍然可以使用
JsonNumber.fromDecimalStringSafe
,它实现了
到字符串
,只返回传入的任何字符串。所以你可以这样做:

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))

}

方法
toPlainString()
避免使用科学符号。我想您必须找到一种方法来使用它,而不是标准的
toString()
。没错,但是没有办法扩展执行该方法的打印机。谢谢你的回答!不是回答,只是评论。我没有一个明确的答案,对不起。非常感谢你的回答,这似乎是最合适的方法!