在Play和Scala中使用JSON

一旦开始使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值