从 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]]
有什么方法可以隐式地将数字解释为 Int
或 Long
?
您没有指定 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)
我从 json 中提取了一张地图。到目前为止这有效。因为我在解析 json 中有哪些字段之前不知道,所以我一直在使用 Map[String, Any]
。每个仅由数字组成的字段都被解释为 BigInt
,这是我不想要的。
我的代码:
implicit val formats: DefaultFormats.type = org.json4s.DefaultFormats
json.extract[Map[String, Any]]
有什么方法可以隐式地将数字解释为 Int
或 Long
?
您没有指定 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)