在尝试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方法。 我将不胜感激任何帮助。提前谢谢!
答案 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)