Какой способ лучше jsonformat в спрей JSON - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть класс дел в scala

case class Employee(designation: Int, name: String)

Теперь я хочу определить для него формат JSON в Spray.

Как я знаю, есть два способа сделать это.

implicit lazy val employeeProtocol: RootJsonFormat[Employee] = jsonFormat2(Employee.apply)

или

implicit lazy val employeeProtocol: RootJsonFormat[Employee] = jsonFormat(Employee, "designation", "name")

Какой из вышеперечисленных является лучшим подходом ??Есть ли разница между ними с точки зрения производительности?

1 Ответ

0 голосов
/ 07 декабря 2018

Здесь, конечно, есть компромиссы.

Есть ли у вас схема (явная или подразумеваемая) для ваших значений JSON?Если да, отличаются ли ключи объекта от имен членов вашего класса дел?Если вы ответили «да» на оба эти вопроса, значит, вы застряли в более явной версии jsonFormat.Если ваш ответ на первый вопрос - «да», а второй - «нет», вы все равно можете использовать более явную версию, просто потому что она немного менее волшебна.

Есть веские причины для предпочтенияверсия jsonFormat2(Employee.apply), хотя.Предположим, у вас есть другая версия:

import spray.json._, DefaultJsonProtocol._

case class Employee(designation: Int, name: String)

implicit lazy val employeeProtocol: RootJsonFormat[Employee] =
  jsonFormat(Employee, "designation", "name")

… а затем кто-то приходит в следующем месяце и реорганизует класс кейса, но не замечает экземпляр:

case class Employee(name: String, designation: Int)

implicit lazy val employeeProtocol: RootJsonFormat[Employee] =
  jsonFormat(Employee, "designation", "name")

Поздравляем:у вас есть программа, которая прекрасно компилируется, но не дает результатов, что может очень сбить с толку.

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

С точки зрения производительности две версии фактически идентичны, и на самом деле jsonFormat2 просто вызывает jsonFormat после использования отражения во время выполнения для извлечения имен членов из целевого типа.Хотя это отражение времени выполнения имеет (крошечные) затраты, такое извлечение будет происходить только один раз при выполнении вашей программы (при условии, что вы используете val или lazy val для определения экземпляра), и двабудет работать точно так же, когда дело доходит до декодирования JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...