2016-03-14 2 views
0

Я новичок в игре, scala и reactivemongo, и мне было интересно, может ли кто-нибудь объяснить мне следующий код в удобных для понимания терминах.Базовый метод Create-from-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

Я считаю, что вы нашли этот код в шаблоне, который я сделал после отличной реактивной документации монго.

Я чувствую себя немного обязан объяснить. Давайте проверим код.

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] .... 

Play предлагает Вам несколько способов справиться с JSON более простым способом. В этих примерах показано, как можно манипулировать непосредственно значениями json без преобразования в модель. Например, если у Вас есть случай класс

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

Вы можете создать автоматически является чтение из него,

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

Но просто хранить его в Монго БД нет никаких причин, чтобы построить этот экземпляр и затем снова преобразуйте его в json. Конечно, если вам нужно сделать некоторую логику с моделями, прежде чем вставлять их, вам может понадобиться создать модель.

Документация:

Имея это в виду, остальная часть кода должна быть ясно

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

Из запроса мы берем тело (JsValue), которое преобразуем его в JsObject (результат), и мы вставляем его в коллекцию. Вставка возвращает Будущее с последней ошибкой, когда персональная сохранена последняя ошибка будет занесена в журнал, а Клиентский код API будет возвращен Созданный (код 201).

Последний бит должен быть также ясно, теперь

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

Если есть какие-либо проблемы синтаксического анализа и преобразования JSon тело запроса в нашу JSObject уже завершили будущее с результатом BadRequest (400 кода) будет возвращаться клиенту. Это будущее, потому что Action.Async нуждается в будущем результата в качестве возвращаемого типа.

Наслаждайтесь скалой.

Смежные вопросы