2015-11-18 2 views
0

Чтобы построить JSON из Скале case class с помощью Play ScalaJson (https://www.playframework.com/documentation/2.4.x/ScalaJson) я должен либо ручная конструкции JsObject или реализаций implicit Writes (что на самом деле означает также ручную работу).Построить JSON из объекта PlayFramework

При использовании lift-web json lib я могу определить implicit f Formats = net.liftweb.json.DefaultFormats, и все преобразования будут выполнены в фоновом режиме.

Каким образом классы классов scala могут быть легко преобразованы в json с помощью play framework json lib?

ответ

2

Вы можете использовать макрос для определения экземпляров или OWrites[T], Reads[T] или OFormat[T] для любого класса классов T.

implicit val writes: Writes[T] = play.api.libs.json.Json.writes[T] 
// Same for Reads or OFormat 

Поскольку OFormat или OWrites определен (доступно, как неявные), то .toJson может быть использовано.

val jsValue: JsValue = Json.toJson(instanceOfT) 

Чтобы сохранить объект специфичностью, то должен сказать, имея JsValue набранный в JsObject, то можно назвать непосредственно.

val jsObj: JsObject = implicitly[OWrites[T]].writes(instanceOfT) 
// works even if a OFormat is defined, as 'compatible' 

С OFormat или Reads определен, .fromJson может быть использован.

val t: JsResult[T] = Json.fromJson[T](jsValue) 
+0

Это не работает для меня. 1) 'implicit Writes [T]' - что, если у меня есть класс case со свойством как другой класс case 'case class P (val c: Node1)' ... Мне нужны импликации для обоих? – Rumoku

+0

Конечно. Вы должны решить/закодировать, как должен обрабатываться каждый тип (верхний уровень или встроенный): по умолчанию экземпляры typeclass, предоставляемые макросами или пользовательскими impl. – cchantep

+0

что я говорил. В 'lift-json' установлен форматтер по умолчанию. Мне не нужно ничего кодировать. – Rumoku

-1

Простое решение использует Play JSon, содержащие вспомогательные функции для обработки JsValues, и определить неявный формат в сопутствующем объекте модели. Этот формат будет использоваться неявно как для сериализации, так и для десериализации. Ниже приведен пример.

import play.api.libs.json.Json 

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

object { 
    implicit val format = Json.format[User] 
} 

Для более полного примера, пожалуйста, посмотрите на этот репозиторий: https://github.com/luongbalinh/play-mongo/blob/master/app/models/User.scala

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