Ответ JSON с Http AKKA и классами case

Я хотел бы построить простой сервер-заглушку с несколькими маршрутами, используя Http AKKA. У меня есть следующий класс case:

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

  object Person {
    implicit def cardJsonFormat: RootJsonFormat[Person] = jsonFormat2(Person.apply)
  }

Как я могу вернуть этот класс case в виде ответа JSON.

Мой маршрут выглядит так:

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

  def route =
    get {
      path("person") {
        complete {

        }
      }
    }

person bashan    schedule 12.07.2016    source источник


Ответы (2)


Вы должны попробовать что-то вроде этого:

import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import akka.http.scaladsl.server.Directives._
import spray.json.DefaultJsonProtocol

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

case object Person extends SprayJsonSupport with DefaultJsonProtocol {
  implicit val personFormat = jsonFormat2(Person.apply)
}

object PersonRoute {
  val route =
    get {
      path("person") {
        complete {
          Person("Pawel", 25)
        }
      }
    }
}

Дополнительные сведения и примеры можно найти в документы.

person Paweł Jurczenko    schedule 12.07.2016
comment
Я это уже пробовал. Я получаю эту ошибку: Несоответствие типов, ожидаемое: ToResponseMarshallable, действующее: Person. Есть идеи, как это решить? - person bashan; 13.07.2016
comment
Похоже, что personFormat не входит в область вашего маршрута. Не могли бы вы показать полный пример вашего кода? Вы можете разместить его на pastebin/gist/etc. - person Paweł Jurczenko; 13.07.2016
comment
Полный пример такой же, как показано здесь. В этом примере он говорит, что: SprayJsonSupport не найден. - person bashan; 13.07.2016
comment
Вы добавили зависимость к "com.typesafe.akka" %% "akka-http-spray-json-experimental" % "2.4.8".? - person Paweł Jurczenko; 13.07.2016
comment
Просто добавил его, и, кажется, он отлично работает. Спасибо. - person bashan; 13.07.2016

Я нашел следующую библиотеку https://github.com/hseeberger/akka-http-json, используемую с json4s полезен. Это помогает мне сократить количество операторов jsonFormatX. Каждый оператор jsonFormatX необходим для каждого типа данных, которые необходимо маршалировать/демаршаллировать.

Просто вставьте следующую черту там, где должны встречаться marshall / unmarshall:

import de.heikoseeberger.akkahttpjson4s.Json4sSupport
import org.json4s.jackson

trait JsonCodec extends Json4sSupport {

  import org.json4s.DefaultFormats
  import org.json4s.ext.JodaTimeSerializers

  implicit val serialization = jackson.Serialization
  implicit val formats = DefaultFormats ++ JodaTimeSerializers.all
}
person neowulf33    schedule 12.07.2016