Как вернуть JSON вместо класса Case в akka-Http

#json #scala #akka-stream #akka-http

#json #scala #akka-stream #akka-http

Вопрос:

Я создал маршрут для потоковой передачи списка класса case в JSON. Но если я использую ByteString, вместо JSON выводится класс case

 def streamRoute: Route = pathEndOrSingleSlash {
        val byteString = new LocalFileParser(config).importFromFiles.map(phoneNumber => ByteString(phoneNumber.toString   "n"))
        complete(HttpEntity(ContentTypes.`application/json`, byteString))
    }
   // RESULT: PhoneNumber( 35799000123,Some(357),Some(Cyprus),Some(Cytamobile-Vodafone),Some(MOBILE))
  

Если я просто использую complete(new LocalFileParser(config).importFromFiles) , то это дает мне JSON. Подходит ли второй метод для потоковой передачи фрагментированного ответа? Если нет, как я могу исправить первый метод для возврата JSON вместо класса Case

Комментарии:

1. Почему вы не можете просто преобразовать свой класс case в JSON?

Ответ №1:

С помощью Json.toJson(result) метода вы можете отправить свой результат в виде JSON,

В вашем случае что-то вроде этого : val byteString = new LocalFileParser(config).importFromFiles.map(phoneNumber => Ok(Json.toJson(phoneNumber)))

Надеюсь, это поможет

PS: Вероятно, Ok — это HTTP-код, который вы хотите отправить туда

Ответ №2:

Учитывая, что вы уже используете Circe, вы можете упростить задачу, добавив эту библиотеку в свой проект:

 "de.heikoseeberger" %% "akka-http-circe" % "<latest-version>"
  

и импортируйте эти два класса, чтобы преобразовать ваш List[PhoneNumber] в HttpResponse содержащий json:

 import de.heikoseeberger.akkahttpcirce.ErrorAccumulatingCirceSupport._
import io.circe.generic.auto._

def streamRoute: Route = pathEndOrSingleSlash {
  complete(new LocalFileParser(config).importFromFiles)
}