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)
我真的建议升级到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的事情变得非常简单.
如果你使用 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)
| 归档时间: |
|
| 查看次数: |
7195 次 |
| 最近记录: |