簡體   English   中英

為什么當String.valueOf()在強制轉換時toString不起作用

[英]Why toString does not work when String.valueOf() works at casting

我需要將Json解析為Map [String,String]結構。 Json可能包含數字和字符串類型作為值。

因此,為了將其存儲為String,我應用了toString方法,並拋出ClassCastException。 但是,如果應用String.valueOf(),則一切正常。

  1. 為什么這樣?
  2. 是否有更好的方法進行這種鑄造?
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule

import scala.collection.Map
import scala.util.parsing.json.JSON

val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)


val str = "[ { \"name\": \"VehicleType\", \"value\": 11 }, { \"name\": \"VehicleWeight\", \"value\": \"12000\" } ]"
val customfields = JSON.parseFull(str) match {
  case Some(map: List[Map[String, String]]) =>
    // map.map(map => {map("name") -> map("value").toString}).toMap

    // that throws:
    // java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String
    //  at #worksheet#.$anonfun$customfields$1.apply(scratch.scala2:14)
    //  at #worksheet#.$anonfun$customfields$1.apply(scratch.scala2:14)
    //  at scala.collection.immutable.List.map(scratch.scala2:269)
    //  at #worksheet#.customfields$lzycompute(scratch.scala2:14)

    // that works fine 
    map.map(map => {map("name") -> String.valueOf(map("value"))}).toMap
  case _ => Map.empty[String, String]
}

因為模式匹配與List類型匹配,但並不會一直映射到地圖中的所有類型,所以這就是為什么要輸入Some子句的原因。

因此,而不是這種case Some(map: List[Map[String, String]]) =>

嘗試這樣做:

case Some(map: List[Map[String, _]]) =>
     map.map(map => {map("name") -> 
     map("value") match {
     case s: String => s
     case i: java.lang.Number => i
     case unexpectedType => throw Exception(s"Unexpected type $unexpectedType")
   }.toString}).toMap

這樣便可以安全地處理地圖中的每個值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM