7

これは私の検索オブジェクトです:

package models.helper
import play.api.libs.json.Format
import play.api.libs.json.JsValue
import play.api.libs.json.JsObject
import play.api.libs.json.JsString

case class Search (name: String, `type`:String){

  implicit object SearchFormat extends Format[Search] {
    def reads(json: JsValue): Search = Search(
      (json \ "name").as[String],
      (json \ "type").as[String]
    )

    def writes(s: Search): JsValue = JsObject(Seq(
        "name" -> JsString(s.name),
        "type" -> JsString(s.`type`)
    ))  
  }
}

WSを使用してWebサービスを呼び出すときに、このクラスを使用しようとしています。

val search = response.json.as[Search]

しかし、scalaコンパイラーはこの行に文句を言い続けます:

タイプmodels.helper.SearchのJsonデシリアライザーが見つかりません。このタイプの暗黙的な読み取りまたはフォーマットを実装してみてください。

誰かが私が間違っていることを教えてもらえますか?

4

1 に答える 1

21

確かに例は間違っています。Format[Search]暗黙のスコープで使用できるようにするには、暗黙の値が必要です。

あなたの場合、Format[Search]はクラスのネストされた値として定義されているSearchため、のインスタンスからのみ到達できますSearch

したがって、実行したいのは、別の場所で定義することです。この場所ではSearch、たとえばFormatsオブジェクト内にインスタンスを作成しなくても参照できます。

object Formats {
  implicit SearchFormat extends Format[Search] {
    …
  }
}

次に、次のように使用できます。

import Formats.SearchFormat
val search = response.json.as[Search]

クラスのコンパニオンオブジェクトで値を定義することにより、輸入税を取り除くこともできます。実際、Scalaコンパイラーは、特定の型の暗黙的な値が必要な場合、型パラメーターのコンパニオンオブジェクトを自動的に検索します。Format[Search]Search

case class Search(name: String, `type`: String)

object Search {
  implicit object SearchFormat extends Format[Search] {
    …
  }
}

次に、インポートせずに使用できます。

val search = response.json.as[Search]
于 2012-05-07T21:14:46.903 に答える