2013-06-11 3 views
4

Недавно я начал использовать Playframework и внедряю сайт, используя Play 2.1.1 и Slick 1.0.0. Теперь я пытаюсь обернуть голову вокруг Json Writes, поскольку я хочу вернуть Json в один из моих контроллеров.Json Writes in Play 2.1.1

Я смотрел на несколько ссылок на эту тему (как this one и this 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 _) 
} 

Вы можете увидеть неявные Вэла, которую я пытаюсь использовать, но когда я пытаюсь вернуть JSON в моем контроллере, делая это:

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

Я someho ж по-прежнему сталкивается с этим ErrorMessage:

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

Я попробовал несколько других способов для осуществления записи. Например, я попытался следующие вместо неявного вал сверху:

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] 
    ) 

}

Может кто-то пожалуйста, мне точку в правильном направлении?

ответ

11

JSON Inception на помощь! Вам нужно только написать

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

Все. Не нужно писать свои собственные Reads и Writes больше, благодаря магии Scala 2.10 макросов. (Я рекомендую вам прочитать документацию играть на Working with JSON, это многое объясняет.)

Edit: я не заметил, что ты уже был Json.format внутри AreaZipcodes объекта. Вам нужно либо переместить эту линию из AreaZipcodes, либо импортировать ее в ваш текущий контекст, то есть

import AreaZipcodes.areaZipcodeFormat 
+0

Спасибо за быстрый ответ! Я некоторое время смотрел на эти документы. И спасибо за предлагаемое решение! Однако, если я заменил неявный val из исходного блока кода вашим неявным объектом, Play начнет жаловаться на метод формата на объекте Json. Есть идеи? – gorow

+0

Просто деталь, очень сжатый синтаксис: неявная область valZipCodeFormat = Json.format [AreaZipcode] –

+0

Oups, извините, ошибка при копировании и вставке. @JulienLafont благодарит за это. – Carsten

Смежные вопросы