Извлечь карту из Json интерпретирует все числа как BigInt - PullRequest
0 голосов
/ 14 ноября 2018

Я извлек карту из JSON. Это работает до сих пор. Поскольку я не знаю до разбора, какие поля есть в json, я использовал Map[String, Any]. Каждое поле, состоящее только из цифр, интерпретируется как BigInt, что мне не нужно.

MyCode:

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

Любой способ неявно сделать числа, интерпретируемые как Int или Long?

1 Ответ

0 голосов
/ 14 ноября 2018

Вы не указали, как создается значение 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 программно, чем вывыберите между BigInt и Long напрямую:

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)

Пример исходного кода

...