Преобразование Scala Case Class Json с именованным корнем

В настоящее время я работаю над небольшим и простым Rest API, используя Playframework 2.4 со Scala. Я определил простой класс case, и он довольно легко преобразуется в Json. Теперь я хотел бы, чтобы объект (и, если результат представляет собой список, каждая запись в этом списке) был назван.

Возможно ли это простым способом? Я только что нашел это, но на самом деле это не решает мою проблему.

case class Employee(name: String, address: String, dob: Date, joiningDate: Date, designation: String)

// Generates Writes and Reads for Feed and User thanks to Json Macros
implicit val employeeReads = Json.reads[Employee]
implicit val employeeWrites = Json.writes[Employee]

Итак, прямо сейчас я получаю

{
  "name": "a name",
  "address": "an address",
  ...
}

Но хотелось бы увидеть что-то вроде:

"employee": {
  "name": "a name",
  "address": "an address",
  ...
}

Для списка объектов должно применяться то же правило:

"employees": [
  "employee": {
    "name": "a name",
    "address": "an address",
    ...
  },
  ...
]

Это возможно с использованием заданных макросов записи? Я немного потерялся прямо сейчас ;-(


person triplem    schedule 09.09.2015    source источник


Ответы (1)


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

{
  "employee": {
    "name": "a name",
    "address": "an address",
    ...
  }
}

и

{
  "employees": [
    {
      "employee": {
        "name": "a name",
        "address": "an address",
        ...
      }
    },
    ...
  ]
}

то создание класса case-оболочки должно решить эту проблему за вас:

import play.api.libs.json._
import play.api.libs.functional.syntax._

// instead of using `reads` and `writes` separately, you can use `format`, which covers both
implicit val employeeFormat = Json.format[Employee]
case class EmployeeWrapper(employee: Employee)

implicit val employeeWrapperFormat = Json.format[EmployeeWrapper]
implicit val employeesWrapperFormat =
  (__ \ "employees").format[List[EmployeeWrapper]]
person Zoltán    schedule 09.09.2015