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