3

まず第一に、私はPlay2Scalaを初めて使用します。モデルオブジェクトをJSONに変換したりJSONから変換したりしようとしています。

このブログによるとhttp://mandubian.com/2012/10/01/unveiling-play-2-dot-1-json-api-part2-writes-format-combinators/ これは私が試したものです

    case class Facility(id:Pk[Int],name:String)

object Facility{

    implicit val facilityWriter = (
     (__ \ "id").write[Pk[Int]] and
     (__ \ "name").write[String]
)(unlift(Facility.unapply))

次に、Pk[Int]のJSONデシリアライザーが見つからないというエラーが表示されました。

だから私はこのようなことを試しました(少しグーグルした後)

implicit object PkFormat extends Format[Pk[Int]] {

    def reads(json:JsValue): Pk[Int] = Id(json.as[Int])
    def writes(id:Pk[Int]):JsNumber = JsNumber(id.get)
}

正確に何が起こっているのかわかりません。coudlntは、anormをシリアル化/逆シリアル化する方法の例を見つけました。

4

1 に答える 1

5

JSONシリアライザー/デシリアライザーは、JSON仕様でカバーされているすべての基本値をサポートします。カスタムタイプをシリアル化する場合は、その方法をシリアライザーに指示する必要があります。

PlayのJSONシリアライザーは、型クラスと呼ばれるScala(元々はHaskell)パターンを使用します。一言で言えば、サブクラス化せずにポリモーフィズムを可能にします。これは、スコープに暗黙の値を含めることによって実現されます。つまり、新しい型を処理するには、暗黙の値/メソッド/オブジェクトを定義します。具体的な例では、の型クラスインスタンスを定義しますPk[Int]

Pk[Int]コードで手動で変換することも、他の多くのフレームワークのようにPkクラスで直接変換を実装することもできますが、型クラスのアプローチはよりクリーンで(JSON変換は別の関心事であるため)、再利用が容易です(今ではPk[Int]どこでも変換できます)Pkクラス自体がそれをサポートしていなくても、クローズドソースシステムを拡張することを想像してみてください)。

コードに関しては、正常に機能するはずです。スコープに必要なインポートがあることを確認してください。

import play.api.libs.json._
import play.api.libs.json.util._
import play.api.libs.json.Writes._
import play.api.libs.functional.syntax._
于 2013-03-12T09:15:58.277 に答える