2017-01-10 10 views
-2

Я создаю HTTP-сервис с помощью scala-play. Я хочу обслуживать ответ JSON.
Для того, чтобы служить в ответ JSON, я создал классы тематических и создал экземпляр Writes [T] Класс, который похож на следующиеСоздание JSON в Scala

case class Point(X: Double, Y: Double) 

implicit val pointWrites = new Writes[Point] { 
    def writes(point: Point) = Json.obj(
    "X" -> point.X, 
    "Y" -> point.Y 
) 
} 

могу ответ сервера, как: val json = Json.toJson(Point(10, 20))

я следовал выше подхода с игровой документации ,

Почему мне нужно определить класс и создать экземпляр Writes [T] для ответа JSON. Если мне нужно создать JSON для десятков классов, мне нужно определить все классы и создать экземпляры для Writes [T]?

можно легко конвертировать любые данные класса в формате JSON с следующим способом:

def getJSON(data: Map[String, String]): JsObject = { 
    JsObject(data.map { el => el._1 -> JsString(el._2) }) 
} 

Все, что нужно сделать, это создать Map [String, String] для любого класса служить JSON.

Почему для воспроизведения документации рекомендуется определить класс case и создать экземпляр Writes [T] для создания представления JSON?

Есть ли другой способ обслуживания создать JSON в scala? Я хочу, чтобы время отклика было минимальным, так что создание JSON должно быстро освещаться.

+0

Если все классы, которые вам нужны, можно охарактеризовать как «Map [String, String]», тогда ваше решение будет прекрасным. Но JSON может представлять другие типы: booleans, числа, массивы, вложенные объекты и т. Д. –

+0

А также о вложенных объектах или объектах JSON, которые зависят друг от друга? Я думаю, что основное преимущество игрового способа использования классов - определить сериализацию JSON один раз, а затем его можно использовать в различных контекстах. – josephpconley

+0

Вам, вероятно, не нужны записи для всего. Он просто позволяет вам выполнять некоторые настройки, такие как изменение имени члена или преобразование значения в какой-либо другой тип. Вы всегда можете попробовать преобразовать объект, не определяя для него записи, и посмотреть, что вы получаете, а затем, если вам нужно что-то другое, добавьте записи. –

ответ

0

Вам не нужно создавать экземпляр Writes. У игры уже есть форматирование по умолчанию для всех регулярных типов (Integer/String/Boolean ..)

Вам просто нужно написать класс case и добавить неявный форматировщик в объект-компаньон.

формат См json.scala [A] Описание из игры:

/** 
    * Creates a Format[T] by resolving case class fields & required implicits at COMPILE-time 
    * 
    * If any missing implicit is discovered, compiler will break with corresponding error. 
    * {{{ 
    * import play.api.libs.json.Json 
    * 
    * case class User(name: String, age: Int) 
    * 
    * implicit val userWrites = Json.format[User] 
    * // macro-compiler replaces Json.format[User] by injecting into compile chain 
    * // the exact code you would write yourself. This is strictly equivalent to: 
    * implicit val userWrites = (
    *  (__ \ 'name).format[String] and 
    *  (__ \ 'age).format[Int] 
    * )(User.apply, unlift(User.unapply)) 
    * }}} 
    */ 
    def format[A] = macro JsMacroImpl.formatImpl[A] 

Назад к вашему примеру, вам нужно всего лишь:

case class Point(X: Double, Y: Double) 

object Point{ 
    implicit val fmtJson = Json.format[Point] 
} 

получить текст JSon просто сделать:

val json = Point.fmtJson.writes (Точка (10, 20)). ToString()

приведет к: json = {"X": 10, "Y": 20 }