1

在尝试使用 Scala/Spray 的第一步时,我遇到了在 spray-json 中正确处理 unicode 的问题。

例如:á 在 json 中生成 \u00e1。生成的标头指示 UTF-8 以及正确的设置 auf -Dfile.encoding=UTF-8 ,它在 Scala 的 System.properties 中显示 UTF-8。

我在这里找到了一个可能的解决方案

但我很惭愧地承认我不知道如何实现这一点,因为我没有直接处理 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))
    )

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

路线内的数据库调用:

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

所以我的问题是,我如何覆盖 JsonPrinter 中的 printString 方法。我将不胜感激任何帮助。先感谢您!

4

1 回答 1

0

Spray 使用 trait 提供的编组spray.httpx.PlayJsonSupport器来编组 Play json 值。在该特征中,它为在范围内具有Writes隐式可用的任何类型定义了一个编组器。

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

如您所见,至少在 1.3.1 版本中,您可以通过提供隐式Function1[JsValue, String]范围来覆盖 JsValue 如何转换为字符串。例如,在您PersonJsonProtocol使用问题中链接的解决方案作为实现的范围内定义以下方法应该会给您期望的结果。

implicit def noUnicodeEscPrettyPrinter(json: JsValue): String = NoUnicodeEscPrettyPrinter(json)
于 2014-08-01T19:58:12.163 回答