2014-02-17 7 views
1

при попытке выполнить мои первые шаги с помощью Scala/Spray у меня возникла проблема с правильной обработкой unicode в спрей-json.Работа с Unicode в Spray-json с переопределением JsonPrinter

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

Я нашел возможное решение here

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

JsonProtocol:

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

Простой Mapping в Person Класс:

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

DB вызовов в пределах маршрутов:

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

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

+0

Для потомков это актуальная проблема в распылителе, которая должна быть решена https://github.com/spray/spray-json/issues/46. –

+0

@DaveSwartz Спасибо. Таким образом, единственный способ, как представляется, находит безотлагательное обходное решение. – Klink

ответ

0

Spray использует маршаллеров, предоставляемых признаком spray.httpx.PlayJsonSupport, для marshall Воспроизвести значения 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)