Это рабочий пример:Зачем нам явно использовать неявный метод для значения карты?
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». Можно ли не полагаться на такие методы, как 'implicit def mapString2JsObject (m: Map [String, String]): JsObject', а затем' implicit def mapStringString2JsObject (m: Map [String, Map [String, String]]): JsObject' и так далее... ? – mirelon
Я отредактировал вопрос, чтобы уточнить, что я прошу – mirelon
Это похоже на то, что вам нужно, - это неявное преобразование вроде: 'implicit def mapStringMap2JsValueMap (m: Map [String, String]): Map [String, JsValue] = m .map {case (k, v) => (k, v: JsValue)} ' – Shadowlands