1
這是工作示例:爲什麼我們需要明確地在地圖上使用隱式方法?
import spray.json._
trait JsonSupport {
implicit def string2JsValue(s: String): JsValue = {
JsString(s)
}
implicit def map2JsObject(m: Map[String, JsValue]): JsObject = {
JsObject(m)
}
implicit def mapString2JsObject(m: Map[String, String]): JsObject = {
JsObject(m.map {
case (k,v) => (k,string2JsValue(v))
})
}
}
目前的情況是,這是工作。但是,如果我更換
implicit def mapString2JsObject(m: Map[String, String]): JsObject = {
JsObject(m.map {
case (k,v) => (k,string2JsValue(v))
})
}
與
implicit def mapString2JsObject(m: Map[String, String]): JsObject = {
JsObject(m)
}
然後出現以下錯誤:
預計:Map[String, JsValue]
,實際:Map[String, String]
爲什麼隱含方法是不是做的工作,我需要隱含地稱它?
是否有可能以某種方式使用implicits,以至於無需爲每個可能的嵌套Map
編寫隱式方法?例如: -
implicit def map1String2JsObject(m: Map[String, String]): JsObject
implicit def map2String2JsObject(m: Map[String, Map[String, String]]): JsObject
implicit def map3String2JsObject(m: Map[String, Map[String, Map[String, String]]]): JsObject
...
是否可以從「JsObject」的構造函數中推斷它?我想徹底刪除'mapString2JsObject'方法並只使用'map2JsObject'。是否有可能不依賴像隱式def mapString2JsObject(m:Map [String,String]):JsObject'然後隱式def mapStringString2JsObject(m:Map [String,Map [String,String]]):JsObject'等等... ? – mirelon
我編輯了這個問題,以便更清楚我在問什麼 – mirelon
這聽起來像你所需要的是一個隱式轉換,如:隱式def mapStringMap2JsValueMap(m:Map [String,String]):Map [String,JsValue] = m .map {case(k,v)=>(k,v:JsValue)}' – Shadowlands