4

私は最近 Playframework を使い始め、Play 2.1.1 と Slick 1.0.0 を使ってサイトを実装しています。コントローラーの1つでJsonを返したいので、Json Writesに頭を悩ませようとしています。

この件に関するいくつかの参考文献を見てきました( これこれのような ものですが、何が間違っているのかわかりません。

次のようなモデルがあります。

case class AreaZipcode(  id: Int,
                     zipcode: String,
                     area: String,
                     city: String
                    )

object AreaZipcodes extends Table[AreaZipcode]("wijk_postcode") {

    implicit val areaZipcodeFormat = Json.format[AreaZipcode]

    def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
    def zipcode = column[String]("postcode", O.NotNull)
    def area = column[String]("wijk", O.NotNull)
    def city = column[String]("plaats", O.NotNull)

    def autoInc = * returning id

    def * = id ~ zipcode ~ area ~ city <> (AreaZipcode.apply _, AreaZipcode.unapply _)
}

使用しようとしている暗黙の val を確認できますが、これを実行してコントローラーで Json を返そうとすると、次のようになります。

Ok(Json.toJson(areas.map(a => Json.toJson(a))))

私はどういうわけかまだこのエラーメッセージに直面しています:

No Json deserializer found for type models.AreaZipcode. Try to implement an implicit     Writes or Format for this type. 

書き込みを実装するために、他のいくつかの方法を試しました。たとえば、上記の暗黙の val の代わりに次のことを試しました。

implicit object areaZipcodeFormat extends Format[AreaZipcode] {

    def writes(a: AreaZipcode): JsValue = {
      Json.obj(
        "id" -> JsObject(a.id),
        "zipcode" -> JsString(a.zipcode),
        "area" -> JsString(a.area),
        "city" -> JsString(a.city)
      )
    }
    def reads(json: JsValue): AreaZipcode = AreaZipcode(
      (json \ "id").as[Int],
      (json \ "zipcode").as[String],
      (json \ "area").as[String],
      (json \ "city").as[String]
    )

}

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

11

JSON インセプションを救え!書くだけでいい

import play.api.libs.json._
implicit val areaZipcodeFormat = Json.format[AreaZipcode]

それでおしまい。Scala 2.10 マクロの魔法のおかげで、自分Readsで書く必要はもうありません。Writes(Play のドキュメント on Working with JSONを読むことをお勧めします。詳しく説明されています。)

編集: あなたがすでにオブジェクトのJson.format中にあることに気づきませんでした。AreaZipcodesその行を移動するかAreaZipcodes、現在のコンテキストにインポートする必要があります。つまり、

import AreaZipcodes.areaZipcodeFormat
于 2013-06-11T09:56:32.910 に答える