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)