#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)
}