Json在Play 2.1.1中写道

时间:2013-06-11 09:33:38

标签: json scala playframework playframework-2.1

我最近开始使用Playframework并使用Play 2.1.1和Slick 1.0.0实现了一个站点。我现在正试图绕着Json写道,因为我想在我的一个控制器中返回Json。

我一直在研究有关该主题的几个参考文献(例如this onethis one,但无法弄清楚我做错了什么。

我的模型看起来像这样:

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. 

我已经尝试了其他几种方法来实现Writes。例如,我尝试了以下内容而不是上面的隐式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]
    )

}

有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:11)

JSON Inception救援!你只需要写

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

就是这样。由于Scala 2.10宏的神奇之处,无需再编写自己的ReadsWrites了。 (我建议您阅读Working with JSON上的Play文档,它解释了很多。)

修改 我没注意到你已经在Json.format对象中有了AreaZipcodes。您需要将该行移出AreaZipcodes或将其导入当前上下文,即

import AreaZipcodes.areaZipcodeFormat