在Spray-json中处理Unicode并覆盖JsonPrinter

时间:2014-02-17 16:23:26

标签: scala spray spray-json

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

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

我找到了一个可能的解决方案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))
    )

人员类中的简单映射:

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

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

1 个答案:

答案 0 :(得分:0)

Spray使用特征spray.httpx.PlayJsonSupport提供的marshallers来编组播放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)