Здесь, конечно, есть компромиссы.
Есть ли у вас схема (явная или подразумеваемая) для ваших значений 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.