这是工作示例:
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
的每个可能嵌套编写隐式方法? E.g:
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
...
答案 0 :(得分:0)
在行case (k,v) => (k,v)
中,您还没有指定案例的结果应该是除(String,String)之外的任何内容。要强制进行隐式转换,您可以写:
case (k,v) => (k,v:JsValue)