2016-03-14 59 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。