使用Play渲染JSON!和斯卡拉

Mil*_*lad 6 json scala playframework playframework-2.0

我有一个关于从Scala类渲染JSON对象的简单问题.为什么我必须实现反序列化器(读,写).

我有以下案例类:

case class User(firstname:String, lastname:String, age:Int)
Run Code Online (Sandbox Code Playgroud)

在我的控制器中:

val milo:User = new User("Sam","Fisher",23);

Json.toJson(milo);
Run Code Online (Sandbox Code Playgroud)

我得到编译错误:找不到类型models.User的Json反序列化器.尝试为此类型实现隐式写入或格式.

在我以前的项目中,我必须在类中实现一个reader,writer对象才能工作,我发现它非常烦人.

object UserWebsite {
  implicit object UserWebsiteReads extends Format[UserWebsite] {

    def reads(json: JsValue) = UserWebsite(
      (json \ "email").as[String],
      (json \ "url").as[String],
      (json \ "imageurl").as[String])

    def writes(ts: UserWebsite) = JsObject(Seq(
      "email" -> JsString(ts.email),
      "url" -> JsString(ts.url),
      "imageurl" -> JsString(ts.imageurl)))
  }
} 
Run Code Online (Sandbox Code Playgroud)

Cri*_*riu 9

我真的建议升级到2.1-RC1,因为在这里,JSON编写器/阅读器很容易定义(更多细节在这里)

但为了帮助您避免一些错误,我会给你进口提示: - 只使用这些进口!(注意不包括json.Reads)

import play.api.libs.json._
import play.api.libs.functional.syntax._
import play.api.libs.json.Writes._
Run Code Online (Sandbox Code Playgroud)

而你只需要编写写的代码/从JSON(读你的类/你当然会有User,而不是Address:

implicit val addressWrites = Json.writes[Address]
implicit val addressReads = Json.reads[Address]
Run Code Online (Sandbox Code Playgroud)

现在,它们将自动使用:

写的例子:

Ok(Json.toJson(entities.map(s => Json.toJson(s))))
Run Code Online (Sandbox Code Playgroud)

举例(我把我做的POST通过读取体JSON创建实体的例子)请注意addressReads这里使用

def create = Action(parse.json) { request =>
        request.body.validate(addressReads).map { entity =>
          Addresses.insert(entity)
          Ok(RestResponses.toJson(RestResponse(OK, "Succesfully created a new entity.")))
        }.recover { Result =>
          BadRequest(RestResponses.toJson(RestResponse(BAD_REQUEST, "Unable to transform JSON body to entity.")))
        }
}
Run Code Online (Sandbox Code Playgroud)

总之,他们尝试(并成功)使JSON的事情变得非常简单.


Iva*_*ith 3

如果你使用 play 2.0.x 你可以这样做

import com.codahale.jerkson.Json._

generate(milo)
Run Code Online (Sandbox Code Playgroud)

生成使用反射来完成此操作。

在 play 2.1 中,您可以使用 Json.writes 为您必须创建的隐式对象创建宏。无需运行时反射!

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

implicit val userWrites = Json.writes[User]
Json.toJson(milo)
Run Code Online (Sandbox Code Playgroud)