2016-03-14 57 views
0

我是新来的play,scala和reactivemongo,想知道是否有人可以用简单的术语来解释下面的代码来理解。基本从JSON创建方法演练

def createFromJson = Action.async(parse.json) { request => 
import play.api.libs.json.Reads._ 

val transformer: Reads[JsObject] = 
    Reads.jsPickBranch[JsString](__ \ "name") and 
    Reads.jsPickBranch[JsNumber](__ \ "age") and 
    Reads.jsPut(__ \ "created", JsNumber(new java.util.Date().getTime())) reduce 

request.body.transform(transformer).map { result => 
    collection.insert(result).map { lastError => 
    Logger.debug(s"Successfully inserted with LastError: $lastError") 
    Created 
    } 
}.getOrElse(Future.successful(BadRequest("invalid json")))} 

我知道它从具有名称和年龄属性的JSON用户创建用户。我不明白的是在这种方法中输入JSON的方式。还有Action.async(par.json),request => getorElse,Future等的概念。

还有任何更简单/更简单的方法来编写此方法将不胜感激。

提前致谢!

+0

在您的示例中有与ReactiveMongo相关的代码。你试过什么?我还建议你有很多[文档](http://reactivemongo.org/releases/0.11/documentation/tutorial/play2.html)。 – cchantep

回答

2

我相信你在模板中找到了这个代码,这个模板是我以下优秀的响应式mongo文档制作而成的。

我觉得有点有义务来解释它。我们来看看代码。

def createFromJson = Action.async(parse.json) { request => 

功能createFromJson将返回一个动作(播放东西)是异步的(返回结果的未来),在JSON格式处理的机构。要做到这一点,它将使用请求。

文档:https://www.playframework.com/documentation/2.5.x/ScalaAsync

一个JSON可以是任何如下的JSON格式,例如阵列的字符串,对象,...

我们的变压器是要采取仅将数据我们感兴趣的是从JSON和将返回一个干净的JSON对象

val transformer: Reads[JsObject] = 
    Reads.jsPickBranch[JsString](__ \ "name") and 
    Reads.jsPickBranch[JsNumber](__ \ "age") and 
    Reads.jsPut(__ \ "created", JsNumber(new java.util.Date().getTime())) reduce 

正如你看到的,它会选择分支作为一个字符串和分支年龄作为一个数字。它还会在创建时添加到最终的json对象创建的

正如你看到的,我们不会将其转化为一个Person实例,它仅仅是一个JsObject实例,因为它是在

val transformer: Reads[JsObject] .... 

播放定义为您提供一些方法来处理JSON在一个简单的方法。这个例子试图展示直接操作json值而不转换为模型的能力。 例如,如果你有一个案例类

case class Person(name: String, age: Int) 

你可以自动创建从它读取,

val personReads: Person[Person] = Json.reads[Person] 

但只是将其存储在蒙戈 DB没有理由建立这个实例,然后再将其转换为json。 当然,如果您在插入模型之前需要对模型进行一些逻辑处理,您可能需要创建模型。

文档:

考虑到这一点的代码的其余部分应明确

request.body.transform(transformer).map { result => 
    collection.insert(result).map { lastError => 
    Logger.debug(s"Successfully inserted with LastError: $lastError") 
    Created 
    } 
} 

从请求中,我们将body(一个JsValue)转换成一个JsObject(result),然后将它插入到集合中。 插入将返回一个带有最后一个错误的Future,当存储Person时,将记录最后的错误并将一个Created(201代码)返回给API的客户端。

最后一位应该也很清楚现在

}.getOrElse(Future.successful(BadRequest("invalid json"))) 

如果解析和转换请求的JSON身体到我们JsObject,结果错误请求(400码)已经完成未来的任何问题会被退回给客户。 这是一个未来,因为Action.Async需要结果的未来作为返回类型。

享受scala。