从 Json 中提取映射将所有数字解释为 BigInt

Extract a map from a Json interprets all numbers as BigInt

我从 json 中提取了一张地图。到目前为止这有效。因为我在解析 json 中有哪些字段之前不知道,所以我一直在使用 Map[String, Any]。每个仅由数字组成的字段都被解释为 BigInt,这是我不想要的。

我的代码:

    implicit val formats: DefaultFormats.type = org.json4s.DefaultFormats
    json.extract[Map[String, Any]]

有什么方法可以隐式地将数字解释为 IntLong

您没有指定 json 值是如何创建的。如果你从 String 解析它,那么 useBigIntForLong 标志就可以了:

import org.json4s.DefaultFormats
import org.json4s.JsonAST._
import org.json4s.native.JsonMethods

object Main {

  def main(args: Array[String]): Unit = {
    implicit val formats: DefaultFormats = DefaultFormats

    val parsedJson = JsonMethods.parse(""" { "a" : 42} """, useBigIntForLong = false)
    parsedJson.extract[Map[String, Any]].foreach {
      case (name, value) => println(s"$name = $value (${value.getClass})")
    }
  }

}

输出:

a = 42 (class java.lang.Long)

如果您以编程方式构建 json 值,那么您可以直接在 BigIntLong 之间进行选择:

val constructedJson = JObject(
  "alwaysBigInt" -> JInt(42),
  "alwaysLong" -> JLong(55),
)
constructedJson.extract[Map[String, Any]].foreach {
  case (name, value) => println(s"$name = $value (${value.getClass})")
}

输出:

alwaysBigInt = 42 (class scala.math.BigInt)
alwaysLong = 55 (class java.lang.Long)

Example source code