繁体   English   中英

用Jackson解析Scala中的ClassCastException映射

[英]ClassCastException parsing Map in Scala with 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))

到目前为止,一切都很好,但是当我尝试访问第二级List或对其进行迭代时,我遇到了以下异常:

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) 

我想念什么?

我认为这是因为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的子类,所以自动强制转换不起作用。

您是否尝试过将提取器用于以String和List [Int]作为参数的Case类映射?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM