ClassCastException使用Jackson

时间:2016-02-22 14:59:15

标签: scala jackson

解析像这样的jsonString之后我遇到了问题:

{"AAAA": [3,4], "BBBB": [1,65]}

所以我按如下方式解析给定的字符串:

import org.json4s.jackson.JsonMethods._

val exampleMap = parse("{\"AAAA\": [3,4], \"BBBB\": [1,65] }").values.asInstanceOf[Map[String,List[Int]]]
exampleMap: Map[String,List[Int]] = Map(AAAA -> List(3, 4), BBBB -> List(1, 65))

到目前为止一切顺利,但是当我尝试访问二级列表或迭代它时,我有这样的例外:

val value = exampleMap("AAAA")(0)
java.lang.ClassCastException: scala.math.BigInt cannot be cast to java.lang.Integer
at scala.runtime.BoxesRunTime.unboxToInt(tests.sc0.tmp:102)
at my.domain.examples.A$A164$A$A164.value$lzycompute(tests.sc0.tmp:7)
at my.domain.examples.A$A164$A$A164.value(tests.sc0.tmp:7)
at #worksheet#.#worksheet#(tests.sc0.tmp:7) 

我错过了什么?

1 个答案:

答案 0 :(得分:0)

我认为这是因为json4s的AST结构如下:

sealed abstract class JValue
case object JNothing extends JValue // 'zero' for JValue
case object JNull extends JValue
case class JString(s: String) extends JValue
case class JDouble(num: Double) extends JValue
case class JDecimal(num: BigDecimal) extends JValue
case class JInt(num: BigInt) extends JValue
case class JBool(value: Boolean) extends JValue
case class JObject(obj: List[JField]) extends JValue
case class JArray(arr: List[JValue]) extends JValue

type JField = (String, JValue)

正如您所看到的,JInt映射到BigInt,这就是您将整数转换为BigInt的原因。然后因为BigInteger不是Integer的子类,所以自动转换不起作用。

您是否尝试将extractors用于包含String和List [Int]作为参数的案例类的Map?