json - 未找到隐式参数

标签 json scala playframework implicit

我很难弄清楚为什么编译器提示没有找到用于读取的隐式参数,因为我几乎可以肯定它在范围内。错误如下:

错误:(13, 18) 找不到类型 Config 的 Json 反序列化器。尝试为此类型实现隐式读取或格式。 测试.validate[配置].map { ^

错误:(13, 18) 方法验证的参数不足:(隐式 rds:play.api.libs.json.Reads[Config])play.api.libs.json.JsResult[wings.m2m.conf。模型.配置]。 未指定值参数 rds。 测试.validate[配置].map { ^

它发生在以下代码中:

import play.api.libs.json._
import play.api.libs.json.Reads._
import Config.JsonImplicits._

import scala.util.Try

object Test {
  def main(args: Array[String]) {

    val test = Json.obj("action" -> Config.Action.nameAcquisitionRequest.toString, "value" -> "hola")
    test.validate[Config].map {
      t => println(t)
        t
    }
  }
}

/**
 * Config companion object
 */
object Config {

  type ValueType = String

  val ActionKey = "action"

  val ValueKey = "value"

  object Action extends Enumeration {

    type Action = Value

    val nameAcquisitionRequest = Value("nameAcquisitionRequest")
    val nameAcquisitionReject = Value("nameAcquisitionReject")
    val nameAcquisitionAck = Value("nameAcquisitionAck")

    val broadcast = Value("broadcast")

  }

  /**
   * Json implicit conversions
   */
  object JsonImplicits {

    implicit object ConfigReads extends Reads[Config] {

      def hTypeCast(action: Config.Action.Value, value: Config.ValueType): Config = {
        action match {
          case Config.Action.nameAcquisitionRequest => NameAcquisitionRequest(value)
          case Config.Action.nameAcquisitionReject => NameAcquisitionReject(value)
          case Config.Action.nameAcquisitionAck => NameAcquisitionAck(value)
        }
      }

      override def reads(json: JsValue): JsResult[Config] = json match {
          case json: JsObject =>
            val action = (json \ ActionKey).as[String]
            Try(Config.Action.withName(action)) map {
              a =>
                val value = (json \ ValueKey).as[String]
                JsSuccess(hTypeCast(a, value))
            } getOrElse (JsError("Can't convert to Config"))
          case _ => JsError("Can't convert to Config")
        }
      }


    implicit object ConfigWrites extends OWrites[Config] {

      def jsObjectCreator(action: Config.Action.Value, value: Config.ValueType): JsObject = {
        Json.obj(ActionKey -> action.toString, ValueKey -> Json.toJson(value))
      }

      override def writes(o: Config): JsObject = o match {
        case c: NameAcquisitionRequest => jsObjectCreator(Config.Action.nameAcquisitionRequest, c.value)
        case c: NameAcquisitionReject => jsObjectCreator(Config.Action.nameAcquisitionReject, c.value)
        case c: NameAcquisitionAck => jsObjectCreator(Config.Action.nameAcquisitionAck, c.value)
      }
    }
  }

}

sealed trait Config {
  val value: Config.ValueType
}

/**
 * Intermediate config message
 * @param value
 */
case class NameAcquisitionRequest(override val value: String)
  extends Config

case class NameAcquisitionReject(override val value: String)
  extends Config

case class NameAcquisitionAck(override val value: String)
  extends Config

case class Broadcast(override val value: String)
  extends Config

错误发生在执行Test对象的main方法时。要使此示例正常运行,请确保在 SBT 中添加以下依赖项: "com.typesafe.play"%% "play-json"% "2.4.1"。我不确定,但也许需要这个解析器:resolvers += "Typesafe Repo"at "http://repo.typesafe.com/typesafe/releases/ "

最佳答案

我不确定你想要达到什么目的,也不确定这是否能解决你的问题,但你开始吧:

test.validate[Config](Config.JsonImplicits.ConfigReads).map {
  t => println(t)
    t
}

关于json - 未找到隐式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32787027/

相关文章:

scala - 数据框过滤器给出 NullPointerException

scala - 运行一个游戏!使用新的 sbt 和 jdk 9 的项目

java - 错误 :Module 'name' production: java. lang.NullPointerException

ruby-on-rails - 覆盖 as_json 或 to_json 模型类名

javascript - 尝试在 JavaScript 中引用 JSON 数组的特定部分

php - 如何获取 YouTube 视频的所有评论

java - JPQL - ManyToMany self 引用

java - 使用 GSON 解析 Json 但列表始终为空

scala - 从连接两个数据帧的 Spark SQL 中删除重复项

scala - 使用 spray 和 futures 超时检索 http 响应