首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析用于Scala的专用字符(例如,è、é和)JSON(2.3.x版)

解析用于Scala的专用字符(例如,è、é和)JSON(2.3.x版)
EN

Stack Overflow用户
提问于 2015-04-13 17:44:01
回答 1查看 916关注 0票数 0

在为Scala (Version2.3.x)解析专用字符(例如èe、é和for )时,我遇到了问题。由于游戏中的所有内容都是UTF-8编码的,所以上述示例(è,é,和)不应成为问题。我应该提到,我正在使用IntelliJ和sbt进行我的开发。

我已经核实了以下情况:

  • 测试文件为UTF-8编码。
  • 使用utf-8的javac (javacOptions ++= Seq("-encoding","UTF-8"))
  • 在标头上设置utf-8 (application/json;charset=utf-8)
  • Parse.tolerantJson(请求)是错误的罪魁祸首(参见下面的代码)

测试文件:

代码语言:javascript
复制
{"id":"295b1590-220a-11e4-b641-90e08f355b68","blah":"è é ®"}

主计长:

代码语言:javascript
复制
      def putGuid(streamId: String, guid: UUID) = Action.async(parseToEventContent) {
    implicit request =>
      render.async {
        case mimeType@(Accepts.Json()) =>
          val id = msgId.next()
          (request.body match {
            case JsonEventContent(j) =>
              eventActor ? SendEventMessages.SendJsonEvent(id, streamId, Some(guid), remoteAddress(request), j)
            case ... some other cases...
          }) map {
            case SendEventMessages.Done(`id`) => NoContent
            case ... more error cases.. blah blah ...
            case SendEventMessages.Unknown(`id`) =>
              Logger.info("Message ID: {}. Received an unknown from underlying actors", id.asInstanceOf[AnyRef])
              ServiceUnavailableRetryAfter()
          } recover exceptionErrorHandler
      } }

其中BodyParser是:

代码语言:javascript
复制
  trait EventContent {}
  case class JsonEventContent(data: JsValue) extends EventContent

  def parseToEventContent: BodyParser[EventContent] = BodyParser("eventContent") {
    request =>
      import play.api.libs.iteratee.Execution.Implicits.trampoline
      request.contentType match {
        case Some(MimeTypes.JSON) => parse.tolerantJson(request).map(_.right.map(JsonEventContent(_)))
        case _ => Done(Left(UnsupportedMediaType), Empty)
      }
  }

编辑#1

在我的测试中使用类似于下面的内容会给出“èé”的400个错误,而对于"abc“则给出204个错误(我的源文件是utf-8,javac被设置为在build.sbt中使用uff-8 ):

代码语言:javascript
复制
val eventC = Json.parse(new String(s"""{"id":"295b1590-220a-11e4-b641-90e08f355b68","blah":"è é ®"}""".getBytes("UTF-8"), "UTF-8"))
val eventCJson = eventC.toString().getBytes("UTF-8")

"return 204 when entity has è, é, ® in json event" in new WithApplication(MyFakeApplication()){
  println(s"json=${eventC}")
  val result = assertPutRequest(s"/streams/com.gilt.clickstream/events/295b1590-220a-11e4-b641-90e08f355b68", 204, event = eventCJson, "application/json", "application/json; charset=utf-8")
  contentType(result) must be equalTo None
  contentAsBytes(result) must be equalTo Array()
}

def assertPutRequest(url: String, httpStatus: Int, event: Array[Byte], acceptHeader: String = "application/json", contentTypeHeader: String = "application/json; charset=utf-8")(implicit app: Application) = {
  Akka.system.actorOf(MockEventActor.props, "event")

  val result = route(
    FakeRequest(PUT, url)
      .withHeaders(
        "Accept" -> acceptHeader,
        "Content-Type" -> contentTypeHeader)
      .withRawBody(event)
  )(new Writeable({ j: AnyContentAsRaw => j.raw.asBytes().get}, None)).get

  status(result) must be equalTo httpStatus
  result
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-01 23:28:18

这个问题的解决方案是升级到JDK1.7。我使用的是JDK1.6,这导致了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29611663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档