gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:47:16 25 4
gpt4 key购买 nike

假设我有下一个案例类:

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,因此当我评估 asJson 时从 circe,我得到了科学记数法的结果:
{
"ID" : "123",
"VALOR_SAP" : 2.7E+7
}

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

我能做些什么来避免这种情况?可能正在创建从 BigDecimal 扩展的另一种类型并覆盖 toString ?

最佳答案

我假设您使用 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))

}

关于json - 如何避免circe JSON序列化中的科学记数法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43687379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com