3

私は Play の初心者で、Web アプリケーションを Play 2.0.4 から新しいピカピカの Play 2.1-RC2 に移行しようとしています。新しい JSON 処理が原因で、コードがコンパイルされません。

Mandubians ブログPlay 2.1 移行ガイド、およびPlay JSON ライブラリ ドキュメント (ベータ版)を読みましたが、コードを移行する最善の方法が何であるかはまだわかりません。

F.ex。File暗黙の Read-Object (Play 2.0) で呼び出されるモデルがあります。

object File {
    implicit object FileReads extends Reads[File] {
      def reads(json: JsValue) = File(
        (json \ "name").as[String],
        (json \ "size").as[Long]
     )
   }
}

コントローラーで次のように使用します(Play 2.0):

val file = webserviceResult.json.as[models.File]

Play 2.1 移行ガイドでは、次のようにリファクタリングするJsSuccess()ように指示されています (Play 2.1?):

object File {
    implicit object FileFormat extends Format[File] {
      def reads(json: JsValue) = JsSuccess(File(
        (json \ "name").as[String],
        (json \ "size").as[Long]
     ))
   }
}

しかし、この暗黙的な変換をどのように使用できますか?

それとも、Play for Scala-bookのTwitter-exampleimplicit valのように -stuffを使用する方が良いですか? JsValue を Scala 値に変換する最良の方法は何ですか?

4

1 に答える 1

7

それとも、Play for Scala ブックの Twitter の例のように、暗黙的な val-stuff を使用する方がよいでしょうか?

はい、古典的な変換の場合、これは良い解決策です (シンプルで簡潔です)。

しかし、「 Json Macro Inception」を使用してこの変換を実現する簡単な方法があります。

import play.api.libs.json._
import play.api.libs.functional.syntax._

case class File(name: String, size: Long)
implicit val fileFormat = Json.format[File]

val json = Json.parse("""{"name":"myfile.avi", "size":12345}""") // Your WS result

scala> json.as[File]
res2: File = File(myfile.avi,12345)

警告: コンパニオン オブジェクトにフォーマッターを配置することはできません。これは、現在の Json API の制限です。

すべての json フォーマッタでオブジェクトを使用し、必要に応じてインポートすることをお勧めします。

参考までに、生のフォーマッターは次のように記述する必要があります。

implicit val rawFileRead: Format[File] = ( 
    (__ \ "name").format[String] and 
    (__ \ "size").format[Long]
)(File.apply _, unlift(File.unapply _)) // or (File, unlift(File.unapply))

これらの 2 つのテスト クラスを確認してください。多くの興味深い例があります。

于 2013-01-12T11:16:25.173 に答える