首页 > 解决方案 > Scala Map 的隐式转换

问题描述

我正在使用 scala 中的隐式设计模式构建自定义 json 解析器>这更多是掌握隐式系统的练习(我知道有一些库可以进行 Json 解析)

我可以让我的 json 解析器将所有内容序列化为映射,但无论出于何种原因,编译器似乎都无法找到我的隐式 JsonMap -> 基本上我想解析一个包含键值对的字符串,将其放入 scala Map 然后将其传递给我的自定义 JsonMap 类。这种方法适用于常规数组,但不适用于 Maps。

返回的错误是No implicits found for parameter converter JsonValue[Map[String, Json]]

我的隐式转换器应该是 JsonValue 类的 MapJsonValue -> Json 对象的 apply 方法采用隐式转换器。谁能看到我在这里做错了什么?

package Json

sealed trait Json

object Json {
  case class JsonString( value: String) extends Json {
    override def toString: String = value
  }
  case class JsonNumber(value: Double) extends Json{
    override def toString: String = value.toString
  }
  case class JsonBoolean(value: Boolean) extends Json{
    override def toString: String = value.toString
  }
  case class JsonNull(value: Null) extends Json{
    override def toString: String = value
  }
  case class JsonList(items: Json*) extends Json

  case class JsonMap(items: Map[String,Json]) extends Json

  object JsonMap{
    def fromString(x: String): Json = {
      var map = x.stripPrefix("{").stripSuffix("}").  split(",").map(_.split(":")).map { case Array(k, v) => (k, Json.fromString(v) ) }.toMap
      map = Json(map)  Error: No implicits found for parameter converter JsonValue[Map[String, Json]]
    }


  }

  object JsonList {
    def fromString(x: String): Json = Json(x.stripPrefix("[").stripSuffix("]") .split(",").toSeq)


  }

  def apply[T](x:T)(implicit converter: JsonValue[T]): Json = converter.serialize(x)

  def fromString(x: String): Json = x match {
    case x if x.startsWith("[") => JsonList.fromString(x)
    case x if x.startsWith("{") => JsonMap.fromString(x)
    case "null" => new JsonNull(value = null)
    case "True" => new JsonBoolean(true)
    case "False"=> new JsonBoolean(false)
    case _ => new JsonString(x)
  }



 }

trait JsonValue[T] {

  def serialize(t: T): Json

}

object JsonValue{
  implicit object StringJsonValue extends JsonValue[String]{
    def serialize(t: String): Json.JsonString = Json.JsonString(t)
  }
  implicit object NumJsonValue extends JsonValue[Double]{
    def serialize(t: Double): Json.JsonNumber = Json.JsonNumber(t)
  }
  implicit object BooleanJsonValue extends JsonValue[Boolean]{
    def serialize(t: Boolean): Json.JsonBoolean = Json.JsonBoolean(t)
  }

  implicit object NullJsonValue extends JsonValue[Null]{
    def serialize(t: Null): Json.JsonNull = Json.JsonNull(t)
  }



  implicit def MapJsonValue[T: JsonValue]: JsonValue[Map[String, T]] = new JsonValue[Map[String, T]]{
    def serialize(t:  Map[String, T]):Json.JsonMap = {
      Json.JsonMap(t.map(t => t._1 -> implicitly[JsonValue[T]].serialize(t._2) )    )
    }
  }

  implicit def SeqJsonValue[T: JsonValue]: JsonValue[Seq[T]] = new JsonValue[Seq[T]]{
    def serialize(t: Seq[T]):Json.JsonList = {
      Json.JsonList(t.map(implicitly[JsonValue[T]].serialize):_*)
    }
  }




}



标签: javajsonscalaimplicit-conversionimplicit

解决方案


推荐阅读