一旦开始使用play键入Scala代码,首先想到的就是JSON。 毫无疑问,JSON是Web应用程序的最基本组件之一。 其余的api使用json,您的角度应用程序必须使用json,然后列表继续。
如果您像我一样懒惰,您希望仅通过控制器传递scala对象或将scala类指定为控制器的参数就足够了。 事情远不能与之相提并论,但是必须进行一些调整。
第一步是指定json模块
libraryDependencies += json
JSON库与Java的org.json库非常相似,但具有更多功能。 我们开箱即用的类型是
JsString
JsBoolean
但是,关键功能来自读写转换器,可用于封送或封送我们的数据结构。
假设我们有一个名为User的类
case class User(id:Option[Long],email:String,firstName:String,lastName:String)
一旦操作完成,我们想使用此类将数据传递给我们的控制器或将其用作响应。
因此,我们需要为User对象创建一个Reader和writer。
implicit val userWrites = new Writes[User] {
def writes(user: User) = Json.obj(
"id" -> user.id,
"email" -> user.email,
"firstName" -> user.firstName,
"lastName" -> user.lastName
)
}
implicit val userReads: Reads[User] = (
(__ \ "id").readNullable[Long] and
(__ \ "email").read[String] and
(__ \ "firstName").read[String] and
(__ \ "lastName").read[String]
)(User.apply _)
您很可能已经注意到ID是可选的。 我们这样做是为了能够传递或不传递用户的ID。
现在让我们将它们放到一个控制器中。
package controllers
import javax.inject.Inject
import com.google.inject.Singleton
import play.api.libs.json._
import play.api.mvc.{Action, Controller}
import play.api.libs.functional.syntax._
/**
* Created by gkatzioura on 4/26/17.
*/
case class User(id:Option[Long],email:String,firstName:String,lastName:String)
@Singleton
class UserController @Inject() extends Controller {
def all = Action { implicit request =>
val users = Seq(
User(Option(1L),"gkazoura@example.com","Emmanouil","Gkatziouras"),
User(Option(2L),"john@doe.com","John","Doe"),
User(Option(3L),"john2@doe.com","John2","Doe2")
)
Ok(Json.toJson(users))
}
def greet = Action
def add = Action { implicit request =>
val user = Json.fromJson[User](request.body.asJson.get).get
val newUser = User(Option(4L),user.email,user.firstName,user.lastName)
Ok(Json.toJson(newUser))
}
implicit val userWrites = new Writes[User] {
def writes(user: User) = Json.obj(
"id" -> user.id,
"email" -> user.email,
"firstName" -> user.firstName,
"lastName" -> user.lastName
)
}
implicit val userReads: Reads[User] = (
(__ \ "id").readNullable[Long] and
(__ \ "email").read[String] and
(__ \ "firstName").read[String] and
(__ \ "lastName").read[String]
)(User.apply _)
}
以及根目录配置
GET /user/ controllers.UserController.all
POST /user/ controllers.UserController.add
如我们所见,all方法以Json格式返回用户对象列表,而add方法应该保留用户对象并为其分配ID。
让我们进行卷曲请求并检查结果
curl http://localhost:9000/user/
....
[{"id":1,"email":"gkazoura@example.com","firstName":"Emmanouil","lastName":"Gkatziouras"},{"id":2,"email":"john@doe.com","firstName":"John","lastName":"Doe"},{"id":3,"email":"john2@doe.com","firstName":"John2","lastName":"Doe2"}]
curl -H "Content-Type: application/json" -X POST -d '{"email":"emmanouil@egkatzioura.com","firstName":"Emmanouil","lastName":"Gkatziouras"}' http://localhost:9000/user/
...
{"id":4,"email":"emmanouil@egkatzioura.com","firstName":"Emmanouil","lastName":"Gkatziouras"}
因此,我们没有进行任何特殊的json处理或读取,而是仅使用对象。 而已! 现在您已准备好进行更多与JSON相关的操作!
您可以在github上检查源代码。
翻译自: https://www.javacodegeeks.com/2017/05/use-json-play-scala.html