Обработка Unicode в Spray-json с переопределением JsonPrinter

во время своих первых шагов со Scala/Spray я столкнулся с проблемой правильной обработки юникода в spray-json.

Например: á приводит к á в json. Результирующий заголовок указывает UTF-8, а также правильную настройку auf -Dfile.encoding=UTF-8, которая показывает UTF-8 в System.properties в Scala.

Я нашел возможное решение здесь

Но мне стыдно признаться, что я понятия не имею, как это реализовать, потому что я не обращаюсь к JsonPrinter напрямую. Вот что у меня есть:

JsonПротокол:

object PersonJsonProtocol extends DefaultJsonProtocol {
  implicit object PersonJsonFormat extends RootJsonFormat[Person] {
    def write(per: Person) = JsObject(
        "name" -> JsString(per.name),
        "surname" -> JsString(per.surname),
        "addresses" ->  JsArray(per.addresses.toList.map(_.toJson))
    )

Простое сопоставление в классе людей:

val simple = {
    get[String]("person_code") ~
    get[String]("name") ~
    get[String]("surname") map {
    case person_code~name~surname => 
    new Person(person_code, name, surname,  adressDao.findAll(person_code))
    }
  }

Вызов БД по маршрутам:

ctx: RequestContext => ctx.complete(StatusCodes.OK, personDAO.findAll())  

Итак, мой вопрос: как я могу перезаписать метод printString в JsonPrinter. Буду признателен за любую помощь. Заранее спасибо!


person Klink    schedule 17.02.2014    source источник
comment
Для потомков это актуальная проблема в spray-json, которую необходимо решить github.com /spray/spray-json/issues/46.   -  person Dave Swartz    schedule 19.02.2014
comment
@DaveSwartz Спасибо. Таким образом, кажется, что единственный способ найти неофициальное обходное решение.   -  person Klink    schedule 19.02.2014


Ответы (1)


Spray использует упорядочиватели, предоставленные трейтом spray.httpx.PlayJsonSupport, для упорядочивания значений Play json. Внутри этого трейта он определяет маршаллер для любого типа, который имеет Writes, неявно доступный в области видимости.

implicit def playJsonMarshaller[T: Writes](implicit printer: JsValue => String = Json.stringify) = ???

Как видите, по крайней мере в версии 1.3.1 вы можете переопределить способ преобразования JsValue в строку, предоставив неявный Function1[JsValue, String] в области видимости. Например, определение следующего метода в рамках вашего PersonJsonProtocol с использованием решения, указанного в вашем вопросе, поскольку реализация должна дать вам желаемые результаты.

implicit def noUnicodeEscPrettyPrinter(json: JsValue): String = NoUnicodeEscPrettyPrinter(json)
person MikeMcKibben    schedule 01.08.2014