java - 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):_*)
}
}
}
解决方案
推荐阅读
- asp.net-mvc - 如何在 chrome 中调试 _Layout.cshtml
- css - 无法在 PhpStorm 中运行 File Watcher 'Sass'
- c# - HangerFire 在删除失败作业时在生产服务器中显示 404 错误
- r - 无法安装 sp 软件包二进制文件?
- vba - 根据其中的值选择销售的 VBA 代码
- ios - Apple Business Chat 中richLinkData 的有效负载是什么
- python - 如果在循环内调用的函数执行时间过长,如何在 python 中跳过循环迭代?
- javascript - 无法迭代多个 JSON 值
- python - API tensorflow 检测 Faster RCNN with FPN
- typescript - 为什么这个对象类型的key是数字或字符串?