Я считаю, что вы нашли этот код в шаблоне, который я сделал после отличной реактивной документации монго.
Я чувствую себя немного обязан объяснить. Давайте проверим код.
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 нуждается в будущем результата в качестве возвращаемого типа.
Наслаждайтесь скалой.
В вашем примере код связан с ReactiveMongo. Что вы пробовали? Я также предлагаю вам много [документации] (http://reactivemongo.org/releases/0.11/documentation/tutorial/play2.html). – cchantep