一次$colon$colon cannot be cast to java.lang.String错误

今天在解析Json的时候遇到了一个错误:
java.lang.ClassCastException: scala.collection.immutable. c o l o n colon colon cannot be cast to java.lang.String

我模拟了下错误,步骤如下:

scala> val json_str="""{"name":"张三","information_sources":[{"latest_used_time":"2019-01-18 09:535","org_type":"1"},{"latest_used_time":"2019-01-20 13:49:40","org_type":"2"},{"latest_used_time":"2019-01-21 18:35:53","org_type":"3"}]}"""
json_str: String = {"name":"张三","information_sources":[{"latest_used_time":"2019-01-18 09:53:35","org_type":"1"},{"latest_used_time":"2019-01-20 13:49:40","org_type":"2"},{"latest_used_time":"2019-01-21 18:35:53","org_type":"3"}]}

scala> val myListtmp = JSON.parseFull(json_str).get.asInstanceOf[Map[String, String]]
myListtmp: Map[String,String] = Map(name -> 张三, information_sources -> List(Map(latest_used_time -> 2019-01-18 09:53:35, org_type -> 1), Map(latest_used_time -> 2019-01-20 13:49:40, org_type -> 2), Map(latest_used_time -> 2019-01-21 18:35:53, org_type -> 3)))

scala> myListtmp("name")
res112: String = 张三

scala> myListtmp("information_sources")
java.lang.ClassCastException: scala.collection.immutable.$colon$colon cannot be cast to java.lang.String
        at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:43)
        at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:48)
        at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:50)
        at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:52)
        at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:54)
        at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:56)
        at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:58)
        at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:60)
        at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:62)
        at $iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:64)
        at $iwC$$iwC$$iwC$$iwC.<init>(<console>:66)
        at $iwC$$iwC$$iwC.<init>(<console>:68)
        at $iwC$$iwC.<init>(<console>:70)
        at $iwC.<init>(<console>:72)
        at <init>(<console>:74)
        at .<init>(<console>:78)
        at .<clinit>(<console>)
        at .<init>(<console>:7)
        at .<clinit>(<console>)
        at $print(<console>)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1045)
        at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1326)
        at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:821)
        at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:852)
        at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:800)
        at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:857)
        at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:902)
        at org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:814)
        at org.apache.spark.repl.SparkILoop.processLine$1(SparkILoop.scala:657)
        at org.apache.spark.repl.SparkILoop.innerLoop$1(SparkILoop.scala:665)
        at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$loop(SparkILoop.scala:670)
        at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply$mcZ$sp(SparkILoop.scala:997)
        at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:945)
        at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:945)
        at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
        at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$process(SparkILoop.scala:945)
        at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:1064)
        at org.apache.spark.repl.Main$.main(Main.scala:35)
        at org.apache.spark.repl.Main.main(Main.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:729)
        at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
        at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

问题分析:
c o l o n colon colon 是Scala里面的 :: 也就是List的类型的一种。
List有两个非常重要的子类,一个是::,一个是Nil,这两个子类都是case class。Nil表示一个空的列表,而::表达的是一个非空的列表。
为什么会报这个错误,暂时不知道,因为::这个类是有mkString可以转换成String的,我自己构造了一个,但是这个却不行。

scala> myListtmp("information_sources").mkString()
<console>:43: error: overloaded method value mkString with alternatives:
  => String <and>
  (sep: String)String <and>
  (start: String,sep: String,end: String)String
 cannot be applied to ()
              myListtmp("information_sources").mkString()


scala> val a=new ::("a",List("b","c"))
a: scala.collection.immutable.::[String] = List(a, b, c)

scala> a
res116: scala.collection.immutable.::[String] = List(a, b, c)

scala> a.mkString
res117: String = abc

scala> a.getClass.getSimpleName
res118: String = $colon$colon

解决方法:
后来我使用了 asInstanceOf转成了List,来解决了问题。

scala> myListtmp("information_sources").asInstanceOf[List[Map[String,String]]]
res119: List[Map[String,String]] = List(Map(latest_used_time -> 2019-01-18 09:53:35, org_type -> 1), Map(latest_used_time -> 2019-01-20 13:49:40, org_type -> 2), Map(latest_used_time -> 2019-01-21 18:35:53, org_type -> 3))

参考资料:
https://scala-lang.org/files/archive/api/2.10.5/#scala.collection.immutable.Nil$

猜你喜欢

转载自blog.csdn.net/action825/article/details/86719833