我有一个关于从
Scala类渲染
JSON对象的简单问题.为什么我必须实现反序列化器(读,写).
我有以下案例类:
case class User(firstname:String,lastname:String,age:Int)
在我的控制器中:
val milo:User = new User("Sam","Fisher",23); Json.toJson(milo);
我得到编译错误:找不到类型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))) } }
解决方法
我真的建议升级到2.1-RC1,因为在这里,JSON编写器/阅读器很容易定义(更多细节
here)
但为了帮助您避免一些错误,我会给你一个进口提示:
– 仅使用这些进口! (注意不包括json.Reads)
import play.api.libs.json._ import play.api.libs.functional.Syntax._ import play.api.libs.json.Writes._
而且你只需编写这段代码就可以将你的课程写入/从Json读取(当然你将拥有User而不是Address:
implicit val addressWrites = Json.writes[Address] implicit val addressReads = Json.reads[Address]
现在,它们将自动使用:
写的例子:
Ok(Json.toJson(entities.map(s => Json.toJson(s))))
阅读的例子(我把我的例子用于通过从身体读取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."))) } }
总之,他们尝试(并成功)使JSON的事情变得非常简单.