【问题标题】:How to transform submitted json in Play 2.0?如何在 Play 2.0 中转换提交的 json?
【发布时间】:2014-12-31 03:19:36
【问题描述】:

我正在尝试使用 play 2.0 构建一个 REST API。我有一个用户案例类,其中包含一些不应通过 updateMember 方法更新的字段(如用户名和密码)。

有没有一种很好的功能性方式来处理多个选项,因为request.body.asJson 返回一个选项[JsValue],而我的用户查找也返回一个选项:

package controllers.api

import org.joda.time.LocalDate
import play.api.Play.current
import play.api.db.slick.{DB, Session}
import play.api.mvc._
import play.api.libs.json._
import play.api.libs.functional.syntax._
import models.{Gender, User, UserId}
import repositories.UserRepository

object Member extends Controller {
  def updateMember(id: Long) = Action {
DB.withSession {
  implicit session: Session =>

    val json: JsValue = request.body.asJson              // how to deal with this?

    val repository = new UserRepository
    repository.findById(new UserId(id)).map {
      user =>
        def usernameAppender = __.json.update(
          __.read[JsObject].map { o => o ++ Json.obj("username" -> user.username) }
        )

        json.transform(usernameAppender)              // transform not found

        Ok("updated")
    }.getOrElse(NotFound)
  }
 }
}

我可以将map 调用移动到我尝试解析请求的位置,但是在里面我想我需要另一个映射到用户选项上,就像我已经拥有的那样。所以在那种风格中,我需要每个选项一个map

在 FP 中有没有更好的方法来处理像这样的多个选项?

【问题讨论】:

    标签: scala playframework-2.0


    【解决方案1】:

    您基本上是在处理一个嵌套的 monad,而使用它的主要工具是 flatMap,特别是如果两个选项都是 None 对您的程序具有相同的语义含义:

    request.body.asJson.flatMap { requestJson =>
      val repository = new UserRepository
      repository.findById(new UserId(id)).map { user =>
        def usernameAppender = __.json.update(
          __.read[JsObject].map { o => o ++ Json.obj("username" -> user.username) }
        )
    
        requestJson.transform(usernameAppender)
    
        Ok("updated") // EDIT: Do you not want to return the JSON?
      }
    }.getOrElse(NotFound)
    

    但也可能是您的Nones 具有不同的含义,在这种情况下,您可能只想进行模式匹配,并分别处理错误情况:

    request.body.asJson match { 
      case Some(requestJson) =>
        val repository = new UserRepository
        repository.findById(new UserId(id)).map { user =>
          def usernameAppender = __.json.update(
            __.read[JsObject].map { o => o ++ Json.obj("username" -> user.username) }
          )
    
          requestJson.transform(usernameAppender)
    
          Ok("updated")
        }.getOrElse(NotFound)
      case None => BadRequest // Or whatever you response makes sense for this case
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-01
      • 2012-05-11
      • 2013-01-16
      • 1970-01-01
      • 2015-08-20
      • 2012-08-12
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多