Question

while trying my first steps with Scala/Spray i ran into a problem with proper handling of unicode in spray-json.

For example: á is resulting \u00e1 in json. The resulting header indicates UTF-8 as well as the proper setting auf -Dfile.encoding=UTF-8 which shows UTF-8 in the System.properties in Scala.

I found a possible solution here

But i am shamed to admit i have no clue how to implement this because i am not adressing the JsonPrinter directly. Here is what i have:

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

Simple Mapping in Person Class:

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 call within the routes:

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

So my question would be, how can i overwrite the printString Method within the JsonPrinter. I would appreciate any help. Thank you in advance!

Was it helpful?

Solution

Spray uses the marshallers provided by the trait spray.httpx.PlayJsonSupport to marshall Play json values. Within that trait, it defines a marshaller for any type that has a Writes implicitly available in scope.

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

As you can see, at least in version 1.3.1, you can override how a JsValue is converted to a string by providing an implicit Function1[JsValue, String] in scope. For example, defining the following method in scope of your PersonJsonProtocol using the solution linked in your question as the implementation should give you the desired results.

implicit def noUnicodeEscPrettyPrinter(json: JsValue): String = NoUnicodeEscPrettyPrinter(json)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top